70

我有以下数据框:

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

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

   c1   c2
0   3   10
1   2   30
2   1   20
3   2   15
4   2  100

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

df.sort(['c1','c2'], ascending=False)

输出:

   c1   c2
0   3   10
4   2  100
1   2   30
3   2   15
2   1   20

但是下面的命令:

df.sort(['c1','c2'], ascending=[False,True])

结果是

   c1   c2
2   1   20
3   2   15
1   2   30
4   2  100
0   3   10

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

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

添加

这是复制粘贴:

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

7 回答 7

79

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'
于 2013-07-12T15:57:02.727 回答
27

使用sort会导致警告消息。请参阅github讨论。所以你可能想使用sort_values,文档在这里

然后您的代码可能如下所示:

df = df.sort_values(by=['c1','c2'], ascending=[False,True])
于 2016-01-14T12:58:01.823 回答
9

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

f.sort_values(by=["c1","c2"], ascending=[False, True])

输出如下所示:

    c1  c2
    3   10
    2   15
    2   30
    2   100
    1   20
于 2016-08-31T10:05:08.633 回答
6

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

f.sort_values(by=["c1","c2"], 升序=[False, True])

只有以下内容按预期工作:

f = f.sort_values(by=["c1","c2"], ascending=[False, True])
于 2016-12-11T23:24:51.267 回答
3

如果您将此代码编写为脚本文件,则必须这样编写:

df = df.sort(['c1','c2'], ascending=[False,True])
于 2015-09-28T18:43:09.403 回答
1

注意:这里的一切都是正确的,只需替换sort --> sort_values () 所以,它变成了:

 import pandas as pd
 df = pd.read_csv('data.csv')
 df.sort_values(ascending=False,inplace=True)

请参阅此处的官方网站。

于 2018-07-01T13:30:02.820 回答
1

我发现这非常有用:

df = pd.DataFrame({'A' : range(0,10) * 2, 'B' : np.random.randint(20,30,20)})

# A ascending, B descending
df.sort(**skw(columns=['A','-B']))

# A descending, B ascending
df.sort(**skw(columns=['-A','+B']))

请注意,与标准columns=,ascending=参数不同,这里的列名及其排序顺序位于同一位置。因此,您的代码变得更容易阅读和维护。

请注意,实际调用.sort没有改变,skw( s ort kw args) 只是一个小的帮助函数,它解析列并为您返回常用参数columns=ascending=参数。像往常一样传递任何其他类型的 kwargs。将以下代码复制/粘贴到例如您的本地utils.py然后忘记它并像上面一样使用它。

# utils.py (or anywhere else convenient to import)
def skw(columns=None, **kwargs):
    """ get sort kwargs by parsing sort order given in column name """
    # set default order as ascending (+)
    sort_cols = ['+' + col if col[0] != '-' else col for col in columns]
    # get sort kwargs
    columns, ascending = zip(*[(col.replace('+', '').replace('-', ''), 
                                False if col[0] == '-' else True) 
                               for col in sort_cols])
    kwargs.update(dict(columns=list(columns), ascending=ascending))
    return kwargs
于 2016-03-06T13:21:34.543 回答