按多级类别分组并返回每个类别中n个最大数之和(n对于每个类别都不同)

2024-10-02 14:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据帧(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)

enter image description here

对于每个人,我想得到食品类中最大的三项费用之和,以及旅行类中最大的两项费用之和

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

enter image description here

我试图使用下面的代码,但问题是我不能在不同的类别中指定不同的N最大开销

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

Tags: 数据iddf人员food代表类别金额
1条回答
网友
1楼 · 发布于 2024-10-02 14:28:51

方法是先按类别拆分数据帧,然后按总和分组,然后将结果串联在一起:

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

相关问题 更多 >