簡體   English   中英

按多級類別分組並返回每個類別中n個最大的總和(每個類別的n不同)

[英]Group by multi-level category and return sum of n-largest in each category (n is different for each category)

我有一個 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-largest 費用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM