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

标签 python pandas pandas-groupby

我有一个 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)

enter image description here

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

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

enter image description here

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

df.groupby(['PersonID','Category'])['Expenditure'].nlargest(2).sum(level=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()])

关于python - 按多级类别分组,返回每个类别中n个最大的和(每个类别的n不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977531/

相关文章:

python - 为什么不可能创建一个实用的 Perl 到 Python 源代码转换器?

python - 如何将脚本的终端日志捕获到文件中?

python - 基于现有列追加新列

pandas 从多列分组中获得 1 排名

python - Pandas Groupby 按索引排序

python - 如何简化python中的for循环

python - 在 python 中根据文本文件中的名称创建文件夹

python - 删除一个词,除非它是另一个词的一部分

python - 如何删除具有一定计数条件的列

python - 如果一行不存在,请在 Python 中相应地检查并赋予一个值