如何使用多列中的值对pandas数据框进行排序?

Rom*_*man 63 python sorting dataframe pandas

我有以下数据框:

df = pandas.DataFrame([{'c1':3,'c2':10},{'c1':2, 'c2':30},{'c1':1,'c2':20},{'c1':2,'c2':15},{'c1':2,'c2':100}])
Run Code Online (Sandbox Code Playgroud)

或者,以人类可读的形式:

   c1   c2
0   3   10
1   2   30
2   1   20
3   2   15
4   2  100
Run Code Online (Sandbox Code Playgroud)

以下排序命令按预期工作:

df.sort(['c1','c2'], ascending=False)
Run Code Online (Sandbox Code Playgroud)

输出:

   c1   c2
0   3   10
4   2  100
1   2   30
3   2   15
2   1   20
Run Code Online (Sandbox Code Playgroud)

但是以下命令:

df.sort(['c1','c2'], ascending=[False,True])
Run Code Online (Sandbox Code Playgroud)

结果是

   c1   c2
2   1   20
3   2   15
1   2   30
4   2  100
0   3   10
Run Code Online (Sandbox Code Playgroud)

这不是我所期望的.我希望第一列中的值从最大到最小排序,如果第一列中有相同的值,则按第二列中的升序值排序.

有人知道它为什么不能按预期工作吗?

添加

这是复制粘贴:

>>> df.sort(['c1','c2'], ascending=[False,True])
   c1   c2
2   1   20
3   2   15
1   2   30
4   2  100
0   3   10
Run Code Online (Sandbox Code Playgroud)

fal*_*tru 71

DataFrame.sort已弃用; 用DataFrame.sort_values.

>>> df.sort_values(['c1','c2'], ascending=[False,True])
   c1   c2
0   3   10
3   2   15
1   2   30
4   2  100
2   1   20
>>> df.sort(['c1','c2'], ascending=[False,True])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/ampawake/anaconda/envs/pseudo/lib/python2.7/site-packages/pandas/core/generic.py", line 3614, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'sort'
Run Code Online (Sandbox Code Playgroud)

  • 建议:颠倒顺序,底部在原位,顶部在上。从上往下阅读,我尝试了第一个程序块,并想知道它为什么失败了,被“对我有用”和“按原样粘贴”(肯定是我的错!)双重困惑。然后我滚动查看更新... (2认同)

Hon*_*zaB 25

使用sort可能会导致警告消息.见github讨论.所以你可能想在这里使用sort_values文档

然后你的代码看起来像这样:

df = df.sort_values(by=['c1','c2'], ascending=[False,True])
Run Code Online (Sandbox Code Playgroud)


fot*_*s j 8

dataframe.sort()方法是 - 所以我的理解 - 在pandas> 0.18中弃用了.为了解决您的问题,您应该使用dataframe.sort_values()代替:

f.sort_values(by=["c1","c2"], ascending=[False, True])
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

    c1  c2
    3   10
    2   15
    2   30
    2   100
    1   20
Run Code Online (Sandbox Code Playgroud)


Ped*_*ito 6

就我而言,接受的答案不起作用:

f.sort_values(by=["c1","c2"], 升序=[假,真])

只有以下按预期工作:

f = f.sort_values(by=["c1","c2"], ascending=[False, True])
Run Code Online (Sandbox Code Playgroud)

  • 严重地?你知道 Pandas 中有一种叫做 [inplace](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort.html) 的东西 (3认同)