与 Excel 类似的 Pandas 小计

问题描述 投票:0回答:2

我有以下数据框

df

     A   B      C
0    21  Blue   100 
1    33  Yellow 100 
2    17  White  250 
3    A2  Grey   40
4    65  Green  500 
5    33  Red    80 
6    17  Purple -50
7    A2  Orange 600

B 列基本上是与代码本身无关的 IRT 信息,但仍需要包含在输出中。 我已按 A 列对数据帧进行排序,并解决了 A 列同时包含 int 和 str 的问题:

df['A'] = df['A'].astype(str)
df_sorted = df.sort_values(by=['A'])

所以现在

df_sorted
看起来像这样:

     A   B      C
2    17  White  250
6    17  Purple -50
0    21  Blue   100
1    33  Yellow 100
5    33  Red    80
4    65  Green  500
3    A2  Grey   40
7    A2  Orange 600

我的问题是:如何通过类似于 Excel 小计功能的汇总 C 列来对 A 列中的每次更改进行小计? 数据框的最终输出应如下所示:

     A        B      C
2    17       White  250
6    17       Purple -50
     Subtotal        200  
0    21       Blue   100
     Subtotal        100
1    33       Yellow 100
5    33       Red    80
     Subtotal        180
4    65       Green  500
     Subtotal        500
3    A2       Grey   40
7    A2       Orange 600
     Subtotal        640
python pandas subtotal
2个回答
4
投票

您可以

concat
您的原始 df 和 groupby 小计。

df1 =  pd.concat([df,
             df.groupby(['A'],as_index=False)['C'].sum()]).sort_values('A')

df1.loc[df1['B'].isnull(), 'A'] = 'Subtotal'

print(df1.fillna(''))

          A       B    C
2        17   White  250
6        17  Purple  -50
0  Subtotal          200
0        21    Blue  100
1  Subtotal          100
1        33  Yellow  100
5        33     Red   80
2  Subtotal          180
4        65   Green  500
3  Subtotal          500
3        A2    Grey   40
7        A2  Orange  600
4  Subtotal          640

0
投票

虽然 Umar 的答案适用于此,但如果您在

B
列中有 NA 值,则可能会出现问题。

基本上,该解决方案在末尾添加一组行,其中包含列 A

NA
以及 C 的总和。按列 A 排序,然后将 A 的值替换为“小计”,其中 B
NA

因此,如果 B 列中已有
NA
值,它也将被重命名为“小计”。

执行此操作的另一种方法是将数据帧拆分为组,将小计附加到末尾,然后将组重新组合在一起。

groups = df.groupby("A")
subtotals = []

for key, group in groups:
    subtotal_row = {"A": "Subtotal", "C": group["C"].sum()}
    subtotals.append(pd.concat([group, pd.DataFrame([subtotal_row])]))

df = pd.concat(subtotals)
© www.soinside.com 2019 - 2024. All rights reserved.