熊猫排名在多个组合级别之内

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

enter image description here我正在尝试基于聚合值在多索引数据帧的多个级别内进行排序。想知道我在说什么:

我有一个分层数据集,然后在多个级别上分组。然后我汇总并总结一定的衡量标准。然后我想把它们排在彼此之内。

在级别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'])
python pandas group-by
1个回答
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步

现在我们可以简单地按Col1Col2进行分组,使用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
© www.soinside.com 2019 - 2024. All rights reserved.