将分类汇总的行添加到数据框

时间:2019-06-18 17:46:19

标签: pandas row subtotal

我使用groupby创建了一个新的聚合数据框,但在每个类别下添加小计行时遇到了问题。

我尝试使用pd.groupby和ivottable并更改索引,但是我无法按需要表示数据。

  • 为每个“客户”创建“ 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。

在此先感谢您提供有关如何显示我的数据的任何提示!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

您可以以其他方式做吗?

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