向我的数据框添加按类别小计的行
Posted
技术标签:
【中文标题】向我的数据框添加按类别小计的行【英文标题】:Adding a row with subtotal by category to my dataframe 【发布时间】:2019-06-18 17:46:19 【问题描述】:我使用 groupby 创建了一个新的聚合数据框,但在每个类别下添加小计行时遇到问题。
我尝试过使用 pd.groupby 和 pivottable 并更改索引,但我无法按照我的意愿来表示数据。
为每个“客户”创建“USD_Balance”小计,但将其添加为列:df_balance['Subtotal'] = df_balance.groupby('Client')['USD_Balance'].transform('sum')
创建 groupby 并与我的原始表合并会得到相同的结果。
+----------+-------------+------------+
|CLient ID | USD_Balance | Subtotal |
+----------+---------+------------+----
| 1 | 2 | 6 |
| 1 | 2 | 6 |
| 1 | 2 | 6 |
+----------+-------------+------------+
我希望如何显示我的数据:
|---------------------|------------------|
| Client ID | USD_Balance |
|---------------------|------------------|
| 1 | 2 |
|---------------------|------------------|
| 1 | 2 |
|---------------------|------------------|
| 1 | 2 |
|---------------------|------------------|
| SubTotal | 6 |
|---------------------|------------------|
我想添加一个小计行,每个客户 ID 组都有相应的 agg。
提前感谢任何关于如何呈现我的数据的指示!
【问题讨论】:
我认为这是groupby
,所以与 dup 答案不完全相同。 OP 只是没有提供更多 client ids
。 @cs95
@Erfan 嗯,没错。我确信它是某些东西的副本。如果你发现什么,请告诉我。现在将重新开放。
我有一个答案,介意我发布吗? @cs95
@Erfan 肯定并赞成。
【参考方案1】:
您可以使用groupby
并访问每个组并添加一个小计行:
dfs = []
for _, d in df.groupby('CLient ID', as_index=False):
d.loc['Total', 'USD_Balance'] = df['USD_Balance'].sum()
dfs.append(d)
df_final = pd.concat(dfs, ignore_index=True)
CLient ID USD_Balance
0 1.0 2.0
1 1.0 2.0
2 1.0 2.0
3 NaN 6.0
【讨论】:
【参考方案2】:sum_res= df.groupby(['CLient ID'],as_index=False)['USD_Balance'].sum()
sum_res['grand_total'] ='Grand Total'
df.sort_values(by=['CLient ID'],ascending=[True],inplace=True)
排序后从原始数据框中分离两列res = df[['CLient ID','USD_Balance']]
final_res = pd.concat([res,sum_res])
final_res = final_res.sort_values(by=['CLient ID','grand_total'],ascending=[True,True],na_position='first')
final_res['CLient ID'] =np.where(final_res['grand_total'].isnull(),
final_res['CLient ID'],
final_res['grand_total'])
final_res.drop(['grand_total'],axis=1,inplace=True)
【讨论】:
您欢迎@CJ123 批准答案,以便更多人可以从解决方案中受益【参考方案3】:你可以用不同的方式来做吗?
dftotal = df.groupby('CLient ID')['USD_Balance'].sum().reset_index()
dftotal['CLient ID'] = 'SubTotal'
pd.concat([df, dftotal])
输出:
CLient ID USD_Balance
0 1 2
1 1 2
2 1 2
0 SubTotal 6
【讨论】:
以上是关于向我的数据框添加按类别小计的行的主要内容,如果未能解决你的问题,请参考以下文章