【问题标题】:double ranking in python after a groupby在 groupby 之后在 python 中的双重排名
【发布时间】:2018-09-08 07:26:53
【问题描述】:

我已经完成了一个 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  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 中做到这一点

【问题讨论】:

  • 如果2 A A3 4 更改为2 A A3 7 会发生什么?

标签: python-2.7 pandas group-by


【解决方案1】:

您可以先在每个组中找到最大值,然后按此局部最大值和列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

【讨论】:

  • 谢谢 MaxU。和以前的答案有什么区别?你只是重置索引吗?或者做更多的事情?顺便说一句,“sort_values”对我不起作用
  • 感谢更新的答案。即使“分配”对我也不起作用。我的公司有一个旧的 python 版本(我不允许升级)
  • 你的 pandas 版本是多少?
  • >>> pd.__version__ '0.14.1'
  • @SBad,无需触摸系统 Python - you can install Anaconda distributive locally, create virtual environments and use those VirtualEnv's in your projects. 这就是我在公司中使用它的方式 - 我有几个具有不同模块和/或不同模块版本的 VirtualEnv,所以它们完全独立于系统 Python(通常是旧 RedHat 机器上的 Python 2.4)并且彼此独立......
【解决方案2】:

使用

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

【讨论】:

  • 感谢您的帮助。 “sort_values”对我不起作用,所以我用 df.sort(['a', 'b'], ascending=[False, False])
【解决方案3】:

我认为首先需要通过聚合获得max 值,然后通过按max 索引排序创建有序Categorical,最后sort_values 按您的需要工作:

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

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 2017-07-04
    • 2020-07-30
    • 2017-03-28
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2016-02-04
    相关资源
    最近更新 更多