如何使用来自多列的值对pandas数据框进行sorting?

我有以下数据框架:

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

或者,以可读的forms:

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

以下sorting命令按预期工作:

 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 

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

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

添加

这是复制粘贴:

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

你的代码适合我。

 >>> import pandas >>> df = pandas.DataFrame([{'c1':3,'c2':10},{'c1':2, 'c2':30},{'c1':1,'c2':20},{'c1':2,'c2':15},{'c1':2,'c2':100}]) >>> df.sort(['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=[True,True]) c1 c2 2 1 20 3 2 15 1 2 30 4 2 100 0 3 10 

更新 DataFrame.sort已弃用; 使用DataFrame.sort_values

 >>> df.sort(['c1','c2'], ascending=[False,True]) __main__:1: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....) c1 c2 0 3 10 3 2 15 1 2 30 4 2 100 2 1 20 >>> 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 

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

那么你的代码可以看起来像这样:

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

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 

就我而言,接受的答案是行不通的:

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

只有以下按预期工作:

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

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

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

我发现这是非常有用的:

 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=参数,在这里列名称和它们的sorting顺序是在同一个地方。 因此,您的代码更易于阅读和维护。

请注意,对.sort的实际调用是不变的, skws或 kw args)只是一个小的帮助函数,用于parsing列并返回通常的columns=ascending=参数。 像平常一样,把它传给任何其他types的战士。 将以下代码复制/粘贴到例如您的本地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