Python 按多级类别分组,每个类别中n个最大的返回和(每个类别的n不同)

Python 按多级类别分组,每个类别中n个最大的返回和(每个类别的n不同),python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个熊猫数据框(df),表示不同个人的每月开支。数据框中的第一列表示人员ID,第二列表示费用类别,第三列表示花费的金额。见下表示例: d={'PersonID':['A'、'A'、'A'、'A'、'A'、'A'、'B'、'B'、'B'、'B'、'B'、'B']、'Category':['Food'、'Food'、'Food'、'Travel'、'Travel'、'Travel'、'Food'、'Travel'、'Travel'、'Travel'、'Travel'、'Travel'、'Trav

我有一个熊猫数据框(df),表示不同个人的每月开支。数据框中的第一列表示人员ID,第二列表示费用类别,第三列表示花费的金额。见下表示例:

d={'PersonID':['A'、'A'、'A'、'A'、'A'、'A'、'B'、'B'、'B'、'B'、'B'、'B']、'Category':['Food'、'Food'、'Food'、'Travel'、'Travel'、'Travel'、'Food'、'Travel'、'Travel'、'Travel'、'Travel'、'Travel'、'Travel'、'Travel'、'Travel'、'Travel'、'Travel'、'支出]:[10,15,5,01000200200010,00130]
df=pd.DataFrame(数据=d)

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

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

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

df.groupby(['PersonID','Category'])['expense'].nlargest(2).sum(级别=0)

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

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