我有以下数据框:
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
答案 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。