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

时间:2013-07-12 15:54:28

标签: 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}])

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

   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

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

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

ADDED

这是复制粘贴:

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

7 个答案:

答案 0 :(得分:63)

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'

答案 1 :(得分:24)

使用sort会导致出现警告消息。请参阅github讨论。 所以你可能想要使用sort_values,文档here

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

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

答案 2 :(得分:8)

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

$get_log = mysqli_query($link, "SELECT * FROM (
    SELECT 
    pl.*, 
    u.username, 
    p.p_name, 
    c.company_name, 
    s.status_name, 
    ps.* 
    FROM projects_log AS pl 
    LEFT JOIN users AS u ON u.user_id =  pl.user_id 
    LEFT JOIN projects AS p ON p.p_id = pl.p_id     
    LEFT JOIN project_status AS ps ON ps.p_id = pl.p_id 
    LEFT JOIN company AS c ON c.cid = ps.cid 
    LEFT JOIN status AS s ON s.sid = ps.sid 
    WHERE pl.cdid = '$cdid' 
    ORDER BY pl.pl_id DESC )
    as new_tab
    GROUP BY new_tab.p_id ");

输出如下:

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

答案 3 :(得分:4)

就我而言,接受的答案并不奏效:

f.sort_values(by = [&#34; c1&#34;,&#34; c2&#34;],ascending = [False,True])

只有以下工作符合预期:

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

答案 4 :(得分:2)

如果您将此代码编写为脚本文件,则必须按如下方式编写:

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

答案 5 :(得分: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

答案 6 :(得分:1)

注意:这里的所有内容都是正确的,只需替换 sort -> sort_values () 因此,它变为:

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

请访问官方网站here