向我的数据框添加按类别小计的行

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

【讨论】:

以上是关于向我的数据框添加按类别小计的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在索引 2 处向 pandas 数据帧添加额外的行而不覆盖现有索引

熊猫选择没有重复的行[重复]

DJANGO - 按类别小计和按项目总计

如何处理组小计,例如WPF DataGrid 中的目标行?

您可以对数据透视表中的行和/或列进行小计吗?

在pandas数据帧中为不同的行添加不同的类别