[英]Pandas groupby and sum total of group
我有一個Pandas DataFrame,有客戶退款原因。 它包含以下示例數據行:
**case_type** **claim_type**
1 service service
2 service service
3 chargeback service
4 chargeback local_charges
5 service supplier_service
6 chargeback service
7 chargeback service
8 chargeback service
9 chargeback service
10 chargeback service
11 service service_not_used
12 service service_not_used
我想將客戶的理由與某種標記的原因進行比較。 這沒問題,但我還希望看到特定組中的記錄總數(客戶原因)。
case_claim_type = df[["case_type", "claim_type"]]
case_claim_type.groupby(by=("case_type", "claim_type"))["case_type"].count()
這給了我這個輸出,例如:
**case_type** **claim_type**
service service 2
supplier_service 1
service_not_used 2
chargeback service 6
local_charges 1
我還想擁有每個case_type的輸出總和。 就像是:
**case_type** **claim_type**
service service 2
supplier_service 1
service_not_used 2
total: 5
chargeback service 6
local_charges 1
total: 7
它不一定必須采用最后的輸出格式,每個case_type的(聚合)總計的列也可以。
哪里:
df = pd.DataFrame({'case_type':['Service']*20+['chargeback']*9,'claim_type':['service']*5+['local_charges']*5+['service_not_used']*5+['supplier_service']*5+['service']*8+['local_charges']})
df_out = df.groupby(by=("case_type", "claim_type"))["case_type"].count()
讓我們使用pd.concat
,與level參數sum
,並assign
:
(pd.concat([df_out.to_frame(),
df_out.sum(level=0).to_frame()
.assign(claim_type= "total")
.set_index('claim_type', append=True)])
.sort_index())
輸出:
case_type
case_type claim_type
Service local_charges 5
service 5
service_not_used 5
supplier_service 5
total 20
chargeback local_charges 1
service 8
total 9
您可以使用:
df = case_claim_type.groupby(by=("case_type", "claim_type"))["case_type"].count()
print (df)
case_type claim_type
chargeback local_charges 1
service 1
service service 2
supplier_service 1
Name: case_type, dtype: int64
您可以創建新的DataFrame
的總sum
,並添加MultiIndex
由MultiIndex.from_tuples
:
df1 = df.sum(level=0)
#same as
#df1 = df.groupby(level=0).sum()
new_cols= list(zip(df1.index.get_level_values(0),['total'] * len(df.index)))
df1.index = pd.MultiIndex.from_tuples(new_cols)
print (df1)
chargeback total 2
service total 3
Name: case_type, dtype: int64
然后concat
起來並最后一次sort_index
:
df2 = pd.concat([df,df1]).sort_index()
print (df2)
case_type claim_type
chargeback local_charges 1
service 1
total 2
service service 2
supplier_service 1
total 3
Name: case_type, dtype: int64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.