熊猫:根据每个组的每个前i记录的总和获得前n个记录

时间:2016-12-15 17:19:32

标签: python pandas grouping

我有一个像这样的pandas数据框:

>>> df

    id    value   
0    1      10
1    1      11
2    1      9
3    2      7
4    2      7
5    2      8
6    3      10
7    3      8

我希望根据前两个值的总和得到前两个id。 所以在这里,我应该得到这个:

    id    # value   
0    1    # 11 + 10 = 21
1    3    # 10 + 8 = 18

我尝试使用:

df.groupby('id')['value'].nlargest(2).sum()

但是这会返回所有最大值的总和。

我找了一个问题的答案,但我找不到合适的答案。

1 个答案:

答案 0 :(得分:5)

groupby.nlargest(2)返回一个包含MultiIndex的系列:

df.groupby('id')['value'].nlargest(2)
Out: 
id   
1   1    11
    0    10
2   5     8
    3     7
3   6    10
    7     8
Name: value, dtype: int64

此处,id和原始索引都出现在返回的Series中。现在,如果你得到总和,它将取这个系列中每个值的总和。但是,如果您在level = 0(或此MultiIndex的id部分)上应用总和,则它将仅分别获取每个ID的总和。

df.groupby('id')['value'].nlargest(2).sum(level=0)
Out: 
id
1    21
2    15
3    18
Name: value, dtype: int64

现在,每个id都有两个最大值的总和。要查找本系列中最大的两个值,您需要再次调用nlargest

df.groupby('id')['value'].nlargest(2).sum(level=0).nlargest(2)
Out: 
id
1    21
3    18
Name: value, dtype: int64