我有以下数据框
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
您可以
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
虽然 Umar 的答案适用于此,但如果您在
B列中有
NA
值,则可能会出现问题。
基本上,该解决方案在末尾添加一组行,其中包含列 A、
NA
以及 C 的总和。按列 A 排序,然后将 A 的值替换为“小计”,其中 B 为 NA
。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)