熊猫根据条件分组并添加列数据

时间:2019-07-30 11:24:30

标签: python pandas pandas-groupby

我已经合并了以下测试数据:

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

感谢您的辛勤工作。

2 个答案:

答案 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