熊猫在多个groupby级别中排名

时间:2018-08-31 15:45:49

标签: python pandas group-by

enter image description here我正在尝试基于聚合值在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'])

1 个答案:

答案 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步

现在,我们可以简单地按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