【问题标题】:Pandas : Get top n records based on the sum of every top i record for each groupPandas:根据每个组的每条前 i 条记录的总和获取前 n 条记录
【发布时间】:2017-10-18 02:45:45
【问题描述】:

我有一个这样的熊猫数据框:

>>> 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()

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

我正在寻找我的问题的答案,但我没有找到正确的答案。

【问题讨论】:

    标签: python pandas grouping


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢,你能解释一下这里的关卡吗?
    • 如何在多列 groupby 中找到前 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 名
    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2021-05-05
    • 2018-11-09
    • 2014-08-28
    相关资源
    最近更新 更多