如何将小计添加到groupby并按降序排列这些小计类别?
How to add subtotals to groupby and rank those subtotal categories in descending order?
示例数据集(请注意,Col_A 和 Col_B 的每个组合都是唯一的):
import pandas as pd
d = {'Col_A': [1,2,3,4,5,6,9,9,10,11,11,12,12,12,12,12,12,13,13],
'Col_B': ['A','K','E','E','H','A','J','A','L','A','B','A','J','C','D','E','A','J','L'],
'Value':[180,120,35,654,789,34,567,21,235,83,234,648,654,234,873,248,45,67,94]
}
df = pd.DataFrame(data=d)
要求生成一个 table,每个 Col_B 的金额、Col_A 的计数和每个 Col_A 的总金额。按总金额降序显示 Col_B 中的类别。
这是我目前拥有的:
df.groupby(['Col_B','Col_A']).agg(['count','sum'])
输出看起来像这样。但是,我想为每个 Col_B 类别添加小计,并按降序排列这些类别的小计,以便满足获取每个 Col_B 的数量的要求。
在此先感谢大家!
我不清楚预期的结果,但这是您想要的吗?
piv = df.groupby(['Col_B', 'Col_A'])['Amount'].agg(['count','sum']).reset_index()
tot = piv.groupby('Col_B', as_index=False).sum().assign(Col_A='Total')
cat = pd.CategoricalDtype(tot.sort_values('sum')['Col_B'], ordered=True)
out = pd.concat([piv, tot]).astype({'Col_B': cat}) \
.sort_values('Col_B', ascending=False, kind='mergesort') \
.set_index(['Col_B', 'Col_A'])
>>> out
count sum
Col_B Col_A
J 9 1 567
12 1 654
13 1 67
Total 3 1288
A 1 1 180
6 1 34
9 1 21
11 1 83
12 2 693
Total 6 1011
E 3 1 35
4 1 654
12 1 248
Total 3 937
D 12 1 873
Total 1 873
H 5 1 789
Total 1 789
L 10 1 235
13 1 94
Total 2 329
C 12 1 234
Total 1 234
B 11 1 234
Total 1 234
K 2 1 120
Total 1 120
示例数据集(请注意,Col_A 和 Col_B 的每个组合都是唯一的):
import pandas as pd
d = {'Col_A': [1,2,3,4,5,6,9,9,10,11,11,12,12,12,12,12,12,13,13],
'Col_B': ['A','K','E','E','H','A','J','A','L','A','B','A','J','C','D','E','A','J','L'],
'Value':[180,120,35,654,789,34,567,21,235,83,234,648,654,234,873,248,45,67,94]
}
df = pd.DataFrame(data=d)
要求生成一个 table,每个 Col_B 的金额、Col_A 的计数和每个 Col_A 的总金额。按总金额降序显示 Col_B 中的类别。
这是我目前拥有的:
df.groupby(['Col_B','Col_A']).agg(['count','sum'])
输出看起来像这样。但是,我想为每个 Col_B 类别添加小计,并按降序排列这些类别的小计,以便满足获取每个 Col_B 的数量的要求。
在此先感谢大家!
我不清楚预期的结果,但这是您想要的吗?
piv = df.groupby(['Col_B', 'Col_A'])['Amount'].agg(['count','sum']).reset_index()
tot = piv.groupby('Col_B', as_index=False).sum().assign(Col_A='Total')
cat = pd.CategoricalDtype(tot.sort_values('sum')['Col_B'], ordered=True)
out = pd.concat([piv, tot]).astype({'Col_B': cat}) \
.sort_values('Col_B', ascending=False, kind='mergesort') \
.set_index(['Col_B', 'Col_A'])
>>> out
count sum
Col_B Col_A
J 9 1 567
12 1 654
13 1 67
Total 3 1288
A 1 1 180
6 1 34
9 1 21
11 1 83
12 2 693
Total 6 1011
E 3 1 35
4 1 654
12 1 248
Total 3 937
D 12 1 873
Total 1 873
H 5 1 789
Total 1 789
L 10 1 235
13 1 94
Total 2 329
C 12 1 234
Total 1 234
B 11 1 234
Total 1 234
K 2 1 120
Total 1 120