Python 2.7 python中groupby之后的双重排名
我做了一个groupby,它生成了一个类似于下面示例的数据帧Python 2.7 python中groupby之后的双重排名,python-2.7,pandas,group-by,Python 2.7,Pandas,Group By,我做了一个groupby,它生成了一个类似于下面示例的数据帧 df = pd.DataFrame({'a': ['A', 'A','A', 'B', 'B','B'], 'b': ['A1', 'A2','A3' ,'B1', 'B2','B3'], 'c': ['2','3','4','5','6','1'] }) >>> df a b c 0 A A1 2 1 A A2 3 2 A A3 4 3 B B1 5 4 B B2 6 5
df = pd.DataFrame({'a': ['A', 'A','A', 'B', 'B','B'], 'b': ['A1', 'A2','A3' ,'B1', 'B2','B3'], 'c': ['2','3','4','5','6','1'] })
>>> df
a b c
0 A A1 2
1 A A2 3
2 A A3 4
3 B B1 5
4 B B2 6
5 B B3 1
期望输出
>>> df
a b c
4 B B2 6
3 B B1 5
5 B B3 1
2 A A3 4
1 A A2 3
0 A A1 2
正如你所看到的,这是一个基于a列然后是b列的双重排名。我们首先从最高点B开始,在B内,我们也从最高点B2开始
我如何在python中做到这一点请使用
In [1072]: df.sort_values(by=['a', 'c'], ascending=[False, False])
Out[1072]:
a b c
4 B B2 6
3 B B1 5
5 B B3 1
2 A A3 4
1 A A2 3
0 A A1 2
您可以首先在每个组中找到最大值,然后根据此局部最大值和列
c
对DF进行降序排序:
In [49]: (df.assign(x=df.groupby('a')['c'].transform('max'))
.sort_values(['x','c'], ascending=[0,0])
.drop('x',1))
Out[49]:
a b c
4 B B2 6
3 B B1 5
5 B B3 1
2 A A3 4
1 A A2 3
0 A A1 2
我认为需要首先通过聚合获得
max
值,然后通过排序max
索引创建排序,最后根据需要进行操作:
c = df.groupby('a')['c'].max().sort_values(ascending=False)
print (c)
a
B 6
A 4
Name: c, dtype: object
df['a'] = pd.Categorical(df['a'], categories=c.index, ordered=True)
df = df.sort_values(by=['a', 'c'], ascending=[True, False])
print (df)
a b c
4 B B2 6
3 B B1 5
5 B B3 1
2 A A3 4
1 A A2 3
0 A A1 2
如果
2A A3 4
更改为2A A3 7
,会发生什么情况?谢谢您的帮助。“sort_values”对我不起作用,所以我用df.sort(['a','b'],升序=[False,False])对它进行了更改。谢谢你,MaxU。与前面的答案有什么不同?你只是在重置索引吗?或者做更多的事情?顺便说一下,“sort_值”不适用于更新答案的甲烷储罐。即使是“分配”对我也不起作用。我的公司有一个旧的python版本(我不允许升级)你的pandas版本是什么?>>>pd.\uuuuu版本\uuuuuu'0.14.1'@SBad,不需要接触系统Python-这就是我在公司中使用它的方式-我有几个VirtualEnv,它们具有不同的模块和/或不同的模块版本,因此它们完全独立于系统Python(在旧RedHat机器上通常是Python 2.4),并且彼此独立。。。