我已经合并了以下测试数据:
Device time Key score
Computers 2018-01-01 14.0 4.0
Computers 2018-01-01 11.0 4.0
Computers 2018-01-01 16.0 0.0
我需要按[Device,time]列对数据进行分组,并按列分数按最大值进行分组,并获取分配给该分数的最小键值。
我的1个豁免项:
df_out = df_out.groupby(['Device', 'time'])['score'].max().reset_index()
输出1:
Device time score
Computers 2018-01-01 4.0
我的2个豁免项:
df_out = df_out.groupby(['Device', 'time'])['score', 'Key'].max().reset_index()
输出2:
Device time score Key
Computers 2018-01-01 4.0 14.0
如何获得适当的最小密钥?
所需的输出:
Device time score Key
Computers 2018-01-01 4.0 11.0
感谢您的辛勤工作。
答案 0 :(得分:4)
您可以使用transform
:
df[df.score.eq(df.groupby(['Device', 'time'])['score'].transform('max'))]
Device time Key score
0 Computers 2018-01-01 14.0 4.0
根据编辑:
df.groupby(['Device', 'time'],as_index=False).agg({'score':'max','Key':'min'})
Device time score Key
0 Computers 2018-01-01 4.0 11.0
答案 1 :(得分:2)
使用apply
和自定义函数通过loc
获取所需的行:
def selecting(x):
subx = x.loc[x['score'] == x['score'].max()]
return subx.loc[subx['Key'].idxmin()]
ddf = df.groupby(['Device', 'time']).apply(selecting)
使用示例输入,将得出:
1 Device time Key score
Device time
Computers 2018-01-01 Computers 2018-01-01 11.0 4.0
您可以在结果上使用.reset_index(drop=True)
删除多索引。
我使用自定义功能编辑了答案,以正确执行选择。我意识到答案的先前版本可能会在更复杂的数据帧上引发KeyError
。