如何使用几列中的值对熊猫数据框进行排序?


68

我有以下数据框:

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

1
您使用的是哪个版本的pandas和numpy?
Felix Zumstein

Answers:


78

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'

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

26

使用sort会导致警告消息。参见github讨论。所以您可能想在这里使用sort_valuesdocs

然后您的代码如下所示:

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

否则,我会收到警告/Applications/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/start_ipython_kernel.py:1: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)
Abhiieor

@patapouf_ai不,sort现在已弃用
oulenz

9

dataframe.sort()方法-依我所知-在大于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

6

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

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

仅以下各项按预期工作:

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

3
认真吗 您知道的熊猫里有个叫做原地的东西
Hng 17/02/3

严重的是,Inplace不能为我工作,否则我不会创建新的答案。
Pedro Lobito

3

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

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

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小号ORT千瓦参数)是只是一个小的辅助函数解析列和回报通常columns=ascending=参数为您服务。像平常一样将其传递给任何其他种类的kwarg。将以下代码复制/粘贴到您的本地代码中,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

2
与其他选项相比,这似乎有些过分。
digitaldavenyc

仅看示例,不看sortkwargs函数。那是一个单一的定义,您可以存储并从例如导入util.py。与默认sort语法相比,您的代码将具有更大的灵活性和可读性。
miraculixx

拒绝所有您喜欢的,请添加评论,以便我改善答案
miraculixx

1

注:一切都在这里是正确的,只需更换排序- > sort_values(),所以,就变成:

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

请参阅此处的官方网站。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.