我正在尝试基于聚合值在groupby多索引数据帧的多个级别中进行排序。对于我在说什么的想法:
我有一个层次数据集,然后将其分为多个级别。然后,我对它们进行汇总和总结。然后,我想将它们相互排名。
在级别0处,值应基于所述度量的总和以降序排列。然后,在级别1之内,应根据所述度量值,级别2的总和再次按降序对值进行排序。
分组后,如何在每个级别进行排序?
我知道不举一个例子很困难,但是如果可以指出正确的方向,那很好,谢谢
编辑: 原始数据:
pd.DataFrame(data=[['a','car',6], ['a','bike',7], ['a','car',8], ['b','bike',9], ['b','car',10], ['b','bike',11]], columns=['a', 'b', 'c'])
分组依据:
df.groupby(['a','b']).agg({'c':'sum'})
重置索引后所需的输出:
pd.DataFrame(data=[['b','bike',20], ['b','car',10], ['a','car',14], ['a','bike',7]], columns=['a', 'b', 'c'])
答案 0 :(得分:0)
更新后的答案
我将其分解为多个步骤(请注意,为清楚起见,我更改了列名,即df.columns=['Col1','Col2','Col3']
)
Col1 Col2 Col3
0 a car 6
1 a bike 7
2 a car 8
3 b bike 9
4 b car 10
5 b bike 11
第1步
我们首先要groupby('Col1')
并使用transform(sum)
根据与给定组关联的Col3
中的值之和来变换数据帧。这将通过使用Col1
存储结果索引并使用它来设置原始数据帧sort_values('Col3', ascending=False)
的索引来设置df
的顺序。
step1 = df.iloc[df.groupby('Col1').transform(sum).sort_values('Col3', ascending=False).index]
哪个给:
Col1 Col2 Col3
3 b bike 9
4 b car 10
5 b bike 11
0 a car 6
1 a bike 7
2 a car 8
第2步
现在,我们可以简单地按Col1
和Col2
进行分组,使用sort=False
保留步骤1中的排序顺序,并基于Col3
的总和进行汇总。使用reset_index()
清理索引并恢复原始列。
step2 = step1.groupby(['Col1','Col2'], sort=False).agg({'Col3': 'sum'}).reset_index()
您想要的输出:
Col1 Col2 Col3
0 b bike 20
1 b car 10
2 a car 14
3 a bike 7