質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1618閲覧

Python 指定条件に合致する範囲の平均を計算したい。

Tubasa1995

総合スコア83

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/19 23:30

Pythonを触るのが2年以上ぶりで、ちょっといいアイデアが浮かばないので助けてください。

今、下記のようなcsvデータがあります。

Time Ux Uy Uz 8:30:00 0.0491646 -0.0002001 0.00402596 8:30:00 0.04885409 -0.002383158 0.003770471 8:30:00 0.04976679 -0.003475622 0.005422015 8:30:00 0.04826003 -0.004453839 0.003875185 8:30:00 0.04794893 -0.001935884 0.003395008 8:30:00 0.05098768 -0.003536097 0.004372599 8:30:00 0.05143833 -0.001048134 0.003362806 8:30:00 0.05202135 -0.001461966 0.002990205 8:30:00 0.05379565 -0.003538994 0.003346398 8:30:01 0.05515847 -0.005891384 0.002454313 8:30:01 0.05621742 -0.007940515 0.002544694 8:30:01 0.05601825 -0.006490421 0.00287806 8:30:01 0.05550477 -0.009249165 0.002430463 8:30:01 0.05656208 -0.008241333 0.0024078 8:30:01 0.0586561 -0.009167475 0.00279996 8:30:01 0.05779947 -0.006925913 0.001816961 8:30:01 0.05558534 -0.003440346 0.002140206 8:30:01 0.05220271 -0.004212458 0.002945417 8:30:01 0.04816291 -0.005834663 0.002247226 8:30:01 0.04559563 -0.002735651 0.002552841 8:30:02 0.04275988 -0.005105641 0.002515985 8:30:02 0.03971009 -0.004192282 0.00194344 8:30:02 0.03749207 0.002352139 0.002638657 8:30:02 0.03499524 -0.00077876 0.00223753 . . . . (続く)

これをpandasとして読み込んで、指定条件・範囲に合致するデータの平均をとりたいと思っています。
例えば、
①UzのTimeが8:30:00のデータの平均、8:30:01のデータの平均を出力。(以下、全時間に対して同様の処理)このデータの場合、10:00:00までのデータがあるので、結果として平均値は90分で1分ごとに平均を出すので合計で90個の値が出力されることになります。

他にやりたいこととして
②UzのTimeが8:30:008:40:00に該当するものの値の平均、8:40:008:50:00に該当するデータの平均を出力。(以下、全時間に対して同様の処理)10:00:00までのデータがあるので、結果として平均値は90分で10分ごとに平均を出すので合計で9個の値が出力されることになります。

現在pandasで読み込むところまでしかできていません、どなたかご教授くださいませんか?
該当するcsvファイルは下記からダウンロードできます。
ダウンロード

import pandas as pd df = pd.read_csv("a.csv")

例えば、愚直にやる方法として、8:30:00に該当するUzを抽出したいときはどのように書けばよいのでしょうか?

import pandas as pd df = pd.read_csv("a.csv") print(df[df['Time']=='8:30:00'])

はできるのですが、それの組み合わせの

print(df[df['Time']=='8:30:00' &['Uz']])

ようなことはできないですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Time列を日時型に変換してやるとpandas.Grouperを使って柔軟に集計できます。
なお、以下の例では集計間隔に外れた「歯抜け」の集計結果行も考慮しdropna()するようにしています。

Python

1import pandas as pd 2from io import StringIO 3 4s = """Time,Ux 58:30:00,1 68:30:00,2 78:30:01,3 88:30:01,4 98:35:00,5 108:35:00,6 118:45:00,7 129:50:00,8""" 13df = pd.read_csv(StringIO(s)) 14df['Time'] = pd.to_datetime(df['Time']) 15 16dfg = df.groupby(pd.Grouper(key="Time", freq="1S")).mean().dropna() 17print(dfg) 18""" 19 Ux 20Time 212021-10-20 08:30:00 1.5 222021-10-20 08:30:01 3.5 232021-10-20 08:35:00 5.5 242021-10-20 08:45:00 7.0 252021-10-20 09:50:00 8.0 26""" 27 28dfg = df.groupby(pd.Grouper(key="Time", freq="10min")).mean().dropna() 29print(dfg) 30""" 31 Ux 32Time 332021-10-20 08:30:00 3.5 342021-10-20 08:40:00 7.0 352021-10-20 09:50:00 8.0 36"""

投稿2021/10/20 01:04

can110

総合スコア38278

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tubasa1995

2021/10/20 01:21

このやり方だと、15分後などや30秒ごとなどの平均にも柔軟に対応できますか?
can110

2021/10/20 01:27

はい。詳細は回答にあげているpandas.Grouperのドキュメントを参照ください。
Tubasa1995

2021/10/21 15:51

すみません、一つ質問させてください。 読み込むデータが8:30からではなく8:40からのときに 15分ごとの平均を出したのですが、出力される時間帯がなぜか8:30からになっているのですが、このコードは30分などの切りがよい時間からはじめないといけないなどの決まりまあるのでしょうか? 1秒、1分、5分の場合はきちんと平均処理の結果が8:40から出力されました。 ドキュメントを見ましたが、どうすればよいかよく分かりませんでした。
Tubasa1995

2021/10/21 16:04

たぶんoffsetを使うという認識なのですが、ただしいでしょうか? ge_15m = measurement.groupby(pd.Grouper(key="Time", freq="15min", offset='8h40min')).mean().dropna() print(average_15m)
can110

2021/10/22 01:40

私はorigin='start'だと思いました。 実際にいろいろオプションを変え動かしながら確認してみてください。
guest

0

以下のようにします。

python

1>>> df = pd.read_csv("a.csv") 2>>> df['Uz'] = df['Uz'].astype(float) 3>>> df['minute'] = df['Time'].str[0:4] 4>>> df_minutes = df.groupby('minute').mean() 5>>> print(df_minutes) 6 Uz 7minute 88:30 0.004898 98:31 0.040731 108:32 0.016423 118:33 0.022241 128:34 -0.021539 13... ... 149:55 0.019326 159:56 0.061793 169:57 0.102390 179:58 0.118774 189:59 0.038646 19 20[90 rows x 1 columns] 21>>> df['deciminute'] = df['Time'].str[0:3] 22>>> df_deciminutes = df.groupby('deciminute').mean() 23>>> print(df_deciminutes) 24 Uz 25deciminute 268:3 0.004275 278:4 0.012203 288:5 0.025224 299:0 0.031627 309:1 0.038843 319:2 0.041475 329:3 0.035811 339:4 0.011146 349:5 0.047722

なぜか、df['Uz']が文字列で読み込まれるので、最初にfloatに変換しています。

投稿2021/10/20 00:05

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tubasa1995

2021/10/20 00:15 編集

返信ありがとうございます。 一つ質問させてください。 df['minute'] = df['Time'].str[0:4] はどのような処理をしているのですか? 特に.str[0:4]は何を意味しているのでしょうか?
Tubasa1995

2021/10/20 00:31

調べてみたので、違ったら教えてください。 df['minute'] = df['Time'].str[0:4]は 単純に8:30などの時間を0~3桁まで数値化して、そのうえでgroupbyをすることによって時間の0~3桁までが同じものをすべてグループ化してそれぞれの平均を題しているということでしょうか? そのためstr[0:4]だと8:30まで、str[0:3]だと8:3などでグループ化されるという理解で正しいでしょうか?
Tubasa1995

2021/10/20 00:40 編集

ただ、この場合、15分ごとの平均だとこの方法は使えないということでしょうか? 今回たまたま1分と10分ごとの平均だったから使えるやり方でしょうか? 例えば、30秒ごとや15分などではまた別のコードを書かないといけないですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問