【问题标题】:Group by multi-level category and return sum of n-largest in each category (n is different for each category)按多级类别分组并返回每个类别中最大 n 的总和(每个类别的 n 不同)
【发布时间】:2019-11-20 11:36:56
【问题描述】:

我有一个 pandas 数据框 (df),代表不同个人的每月支出。数据框中的第一列指的是个人 ID,第二列指的是费用类别,第三列指的是花费的金额。见下表:

d = {'PersonID': ['A','A','A','A','A','A','A','A','B','B','B','B','B','B'], 'Category': ['Food','Food','Food','Food','Travel','Travel','Travel','Travel','Food','Food','Food','Travel','Travel','Travel'], 'Expenditure':[10,15,5,20,500,100,1000,2000,10,30,10,800,1000,400]}
df = pd.DataFrame(data=d)

对于每个人,我想得到食品类别中三个最大支出的总和,以及旅行类别中两个最大支出的总和。

对于上面的示例表,我想要下表:

我正在尝试使用以下代码,但问题是我无法在不同类别中指定不同的 N 最大费用。

df.groupby(['PersonID','Category'])['Expenditure'].nlargest(2).sum(level=0)

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    这样做的方法是先按类别拆分数据框,然后按总和分组,然后将结果连接在一起:

    pd.concat([
    df.query('Category == "Food"').groupby(['PersonID','Category'])['Expenditure'].nlargest(3).sum(level=[0,1]),
    df.query('Category == "Travel"').groupby(['PersonID','Category'])['Expenditure'].nlargest(2).sum(level=[0,1])
    ])
    

    输出:

    PersonID  Category
    A         Food          45
    B         Food          50
    A         Travel      3000
    B         Travel      1800
    Name: Expenditure, dtype: int64
    

    使用字典和列表理解:

    d = {'Food':2,
         'Travel':3}
    
    pd.concat([df[df['Category'] == c].groupby(['PersonID','Category'])['Expenditure'].nlargest(n).sum(level=[0,1]) for c,n in d.items()])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 2020-08-26
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2020-11-30
      • 2017-06-21
      • 2018-03-12
      相关资源
      最近更新 更多