使用熊猫返回每组的前N个最大值

时间:2019-06-05 22:33:35

标签: python pandas dataframe group-by

我正在尝试查找序列数的最大值,每个序列均按提取其的列的名称分组。

我有一个这样的数据框:

MASTER      SLAVE       Value

Master_1    Slave_1     657879
Master_1    Slave_2     34343
Master_1    Slave_3     453313

Master_2    Slave_1     56667
Master_2    Slave_2     6879
Master_2    Slave_3     12333
Master_2    Slave_4     789
Master_2    Slave_5     22235

Master_3    Slave_1     65765
Master_3    Slave_2     23431
Master_3    Slave_3     445
Master_3    Slave_4     567

我需要找到每个主设备的前两个从设备的最大值。

到目前为止,我还没有得到:

df.groupby('MASTER')['SLAVE'].unique()

它为每个“主”输出系列“从”值:

Master_1    [657879, 34343, 453313]
Master_2    [56667, 6879, 12333, 789, 22235]
Master_3    [65765, 23431, 445, 789, 567]

但是在输入之后,我无法理解我正在处理什么类型的数据。以及如何对这些值进行排序。

2 个答案:

答案 0 :(得分:1)

IIUC,一个选项是sort_valuesGroupBy.head,其中n = 2:

df.sort_values('Value', ascending=False).groupby('MASTER', sort=False).head(2)

     MASTER    SLAVE   Value
0  Master_1  Slave_1  657879
2  Master_1  Slave_3  453313
8  Master_3  Slave_1   65765
3  Master_2  Slave_1   56667
9  Master_3  Slave_2   23431
7  Master_2  Slave_5   22235

另一个正在使用set_indexGroupBy.nlargest且n = 2:

df.set_index('SLAVE').groupby('MASTER')['Value'].nlargest(2).reset_index()

     MASTER    SLAVE   Value
0  Master_1  Slave_1  657879
1  Master_1  Slave_3  453313
2  Master_2  Slave_1   56667
3  Master_2  Slave_5   22235
4  Master_3  Slave_1   65765
5  Master_3  Slave_2   23431

答案 1 :(得分:0)

您可以结合使用sort和groupby:

df.sort_values(['MASTER', 'Value'], ascending=[True, False], inplace=True)
grp = df.groupby('MASTER')['SLAVE'].indices
slaves = {k: df.loc[k][:2]['SLAVE'].values  for k in grp.keys()}

将输出:

{'Master_1': array(['Slave_1', 'Slave_3'], dtype=object),
 'Master_2': array(['Slave_1', 'Slave_5'], dtype=object),
 'Master_3': array(['Slave_1', 'Slave_2'], dtype=object)}