Pandas:根据每个组中前i个记录的总和获取前n条记录

3

I have a pandas dataframe like this :

>>> 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个回答

7

groupby.nlargest(2) 返回一个带有多索引的Series:

该方法与groupby结合使用,可按照分组后的数据进行排序,并返回每个组中前两个最大值所对应的索引和值。
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

在这里,返回的Series中既有id又有原始索引。现在如果你对其求和,它将对该Series中的每个值求和。但是,如果你在level=0(或该MultiIndex的id部分)上应用sum函数,则仅会对每个id单独求和。

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

现在你已经得到了每个id的两个最大值之和。要找到该Series中最大的两个值,你需要再次调用nlargest

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

谢谢,你能解释一下这里的level是做什么用的吗? - Barker
你如何在多列分组中找到前10个?我使用了result=df_sas.groupby(['Year','Month','fbi_code'])['ArrestInt'].sum().reset_index(),然后用mask=result['ArrestInt']>30筛选数据,最后用fbi_codes=result[mask]['fbi_code'].unique()得到结果。但这种方法很繁琐,我没有得到前10名的结果。 - Golden Lion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接