メモランダム!!

自分用の端書のため,他の人が読めるようには書いていません.悪しからずm(_ _)m

Pandas:グループ毎に括って最大の値を含む列を抜き出す

PythonのライブラリーであるPandasを使って,「グループ毎に括って最大の値を含む列を抜き出す」方法のメモです.

対象とするのはこんなデータ 

Sensor Time Value
0 T-A 10:00:00 25
1 T-B 10:00:01 30
2 T-C 10:00:02 104
3 T-B 10:00:03 52
4 T-C 10:00:04 41
5 T-A 10:00:05 91
6 T-C 10:00:06 102
7 T-B 10:00:07 40
8 T-B 10:00:08 101
9 T-C 10:00:09 97

 
3種類のSensorから時間と検知された値(Value)が返ってきます.
Sensorの種類ごとに括って,その中で最大の値を出す時間(と言うか行)を抜き出す,というのが今回の狙いです.
 
コードは下記の通り.
特定の列に含まれる最大値を含む行を抜き出す(日本語が複雑・・)方法が分からなかったのでやや力技を使いました.

import pandas as pd

# データ生成
df = pd.DataFrame(
        {'Time': ['10:00:00', '10:00:01', '10:00:02', '10:00:03', '10:00:04','10:00:05', '10:00:06', '10:00:07', '10:00:08', '10:00:09'],
         'Sensor': ['T-A', 'T-B', 'T-C', 'T-B', 'T-C', 'T-A', 'T-C', 'T-B' ,'T-B' ,'T-C'],
           'Value': [25, 30, 104, 52, 41, 91, 102, 40 ,101 ,97]})

# datetime型に変換
df['Time'] = df['Time'].apply(lambda dd: pd.to_datetime(dd))

# 'Sensor'で括る    
df_g = df.groupby('Sensor')

# 'Sensor'でくくられたデータフレームの中で'Value'に最大値を含む行を抜き出す
def select(xx):
    # 'Value'に最大値を含む行を抜き出す(そういうメソッドがあるのかもしれないけど分からなかった)
    val_r = xx[xx['Value'] == max(xx['Value']) ]
    
    # 全く同じ行があった場合は削除(このデータの場合は無いですけど)
    val_r = val_r.drop_duplicates()
    
    return val_r

df_new = df_g.apply(select)

ご覧の通り,Valueに含まれる最大値を含む行は無理やり書きました.
結果は下記の通り
 

Sensor Time Value
Sensor 
T-A 5 T-A 2017-10-08 10:00:05 91
T-B 8 T-B 2017-10-08 10:00:08 101
T-C 2 T-C 2017-10-08 10:00:02 104