はじめに
やりたいことは
- データを一日単位でグルーピング
- ある列の最大値と、その時の他の列の値を取得する
の2点です。
最大値取得は簡単なのですが、その値が最大値をとる時の、他の列の値を取得するのに手間取ったので記録しておきます。
ソース
まず、データとして以下のようなCSVを読み込みました。
1ヶ月分の、1時間単位の気温と湿度のCSVです。
sample.py
import pandas as pd
df = pd.read_csv('data.csv', index_col=0, parse_dates=True)
df
temperature humidity
date
2018-10-26 01:00:00 16.3 75
2018-10-26 02:00:00 16.5 70
2018-10-26 03:00:00 16.0 68
2018-10-26 04:00:00 15.3 68
2018-10-26 05:00:00 15.7 66
2018-10-26 06:00:00 15.8 69
... ... ...
2018-11-26 21:00:00 13.7 70
2018-11-26 22:00:00 14.1 65
2018-11-26 23:00:00 13.4 70
2018-11-27 00:00:00 13.7 68
インデックスがdate,カラムはtemperature(気温)とhumidity(湿度)となっています。
ここから、一日の最大気温とその時の湿度を抽出します。
sample.py
# 一日の最大気温
max_temp_series = df['temperature'].groupby(pd.Grouper(freq='D')).max()
# 最大気温の時のインデックス
max_temp_index = df['temperature'].groupby(pd.Grouper(freq='D')).idxmax()
# 最大気温の時の湿度
humidity_series = df.loc[df.index.isin(max_temp_index), 'humidity']
以上です。やってることとしては
- groupby(pd.Grouper(freq='D'))で一日単位にグルーピング
- idxmax()で気温が一日最大の時のインデックスを取得
- グルーピング前のデータフレームから、取得したインデックスで湿度を抽出
という流れです。
idxmax()がグルーピング後にも使えるということを知らなかったので時間がかかりました。
終わりに
もっと簡潔な方法がありそうな気がするので、何かあったらコメントをお願いします。