Python 熊猫在多个分组级别中排名
我试图在基于聚合值的groupby多索引数据帧的多个级别内进行排序。想知道我在说什么: 我有一个分层数据集,然后在多个级别上分组。然后,我对它们进行聚合和求和。然后,我想把它们放在一起 在0级,值应根据所述度量值的总和按降序排列。然后,在级别1中,应根据所述度量值和级别2的总和,再次按降序排列值 分组后,我如何在每个级别进行排序 我知道不举一个例子很难,但如果我能被指向正确的方向那就太好了,谢谢 编辑: 原始数据:Python 熊猫在多个分组级别中排名,python,pandas,group-by,Python,Pandas,Group By,我试图在基于聚合值的groupby多索引数据帧的多个级别内进行排序。想知道我在说什么: 我有一个分层数据集,然后在多个级别上分组。然后,我对它们进行聚合和求和。然后,我想把它们放在一起 在0级,值应根据所述度量值的总和按降序排列。然后,在级别1中,应根据所述度量值和级别2的总和,再次按降序排列值 分组后,我如何在每个级别进行排序 我知道不举一个例子很难,但如果我能被指向正确的方向那就太好了,谢谢 编辑: 原始数据: pd.DataFrame(data=[['a','car',6], ['a','
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']
):
步骤1
我们首先希望groupby('Col1')
并使用transform(sum)
基于与给定组关联的Col3
中的值之和来转换数据帧。通过使用sort_值('Col3',升序=False)
存储结果索引并使用该索引设置原始数据帧df
的索引,设置Col1
的顺序
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
请发布一个数据帧和所需的输出,换句话说,a我添加了一个示例,我想在每个列排序a b请将数据帧发布为文本,并包括一个所需的输出添加了数据帧的文本不确定如何复制它们印加你向我解释你是如何得到
['b','car',14]
?您将groupby(['a','b'])
然后agg({'c':'sum'})
仅通过排序方法分离这些值是没有意义的。14的值是通过8和6中的一些产生的,这是与a
和car
相关的值,而不是b
。这不是他想要的输出。我希望“b”在“a”之前,因为总和更大。您在这里指的是哪个总和?你能解释一下在我的答案中使用输出吗?我会相应地修改。在我的编辑中,我包含了我想要的输出。在这种情况下,“c”的和。按我的“a”列分组,“b”的值之和大于“a”的值之和,因此“b”值应排在第一位。我已更新了我的答案,感谢您澄清您的要求。
Col1 Col2 Col3
0 b bike 20
1 b car 10
2 a car 14
3 a bike 7