我正在尝试基于聚合值在多索引数据帧的多个级别内进行排序。想知道我在说什么:
我有一个分层数据集,然后在多个级别上分组。然后我汇总并总结一定的衡量标准。然后我想把它们排在彼此之内。
在级别0,值应该基于所述度量的总和以降序排列。然后在级别1内,值应该基于所述度量的总和,级别2等依次按降序排列。
在groupby之后,我如何在每个级别进行排序?
我知道不提供一个例子是艰难的,但如果我能指出正确的方向,那将是伟大的,谢谢
编辑:原始数据:
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'])
更新的答案
我会将其分解为多个步骤(请注意,为了清晰起见,我更改了列名,即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