Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按两列或多列对python中的数据帧进行排序?_Python_Pandas_Python 2.7_Sorting_Data Analysis - Fatal编程技术网

如何按两列或多列对python中的数据帧进行排序?

如何按两列或多列对python中的数据帧进行排序?,python,pandas,python-2.7,sorting,data-analysis,Python,Pandas,Python 2.7,Sorting,Data Analysis,假设我有一个数据框,其中包含列a、b和c,我想按列b按升序对数据框进行排序,按列c按降序对数据框进行排序,我该如何做到这一点呢?自0.17.0发布以来,该方法已被弃用,取而代之排序在0.20.0版本中被完全删除。参数(和结果)保持不变: df.sort_values(['a', 'b'], ascending=[True, False]) 您可以使用以下的升序参数: 例如: In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2))

假设我有一个数据框,其中包含列
a
b
c
,我想按列
b
按升序对数据框进行排序,按列
c
按降序对数据框进行排序,我该如何做到这一点呢?

自0.17.0发布以来,该方法已被弃用,取而代之<代码>排序在0.20.0版本中被完全删除。参数(和结果)保持不变:

df.sort_values(['a', 'b'], ascending=[True, False])

您可以使用以下的升序参数:

例如:

In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])

In [12]: df1.sort(['a', 'b'], ascending=[True, False])
Out[12]:
   a  b
2  1  4
7  1  3
1  1  2
3  1  2
4  3  2
6  4  4
0  4  3
9  4  3
5  4  1
8  4  1

正如@renadeen所评论的


默认情况下,排序不到位!所以,您应该将sort方法的结果分配给一个变量,或者将inplace=True添加到方法调用中

也就是说,如果要将df1重新用作已排序的数据帧:

df1 = df1.sort(['a', 'b'], ascending=[True, False])


从pandas 0.17.0开始,
DataFrame.sort()
已被弃用,并设置为在pandas的未来版本中删除。按值对数据帧进行排序的方法现在是
dataframe.sort\u values

因此,你的问题现在的答案是

df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)

对于数字数据的大型数据帧,您可能会看到通过以下方式显著提高性能,即使用一系列键执行间接排序:

import pandas as pd
import numpy as np

np.random.seed(0)

df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)

def pdsort(df1):
    return df1.sort_values(['a', 'b'], ascending=[True, False])

def lex(df1):
    arr = df1.values
    return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])

assert (pdsort(df1).values == lex(df1).values).all()

%timeit pdsort(df1)  # 193 ms per loop
%timeit lex(df1)     # 143 ms per loop
一个特点是定义的排序顺序与
numpy.lexsort
相反:
('b','a')
首先按序列
a
排序。我们否定序列
b
,以反映我们希望该序列按降序排列


请注意,仅使用数值进行排序,而使用字符串或数值进行排序。对字符串使用
np.lexsort
将给出:
类型错误:一元操作数类型错误-:'str'

检查此答案这是否回答了您的问题?默认情况下,排序不到位!所以,您应该将
sort
方法的结果指定给一个变量,或者将
inplace=True
添加到方法调用中。@renadeen非常好的一点,我已经用该注释更新了答案。今天得知sort被弃用,我很惊讶!基于这篇博文中的一些观点:我决定添加一个新的答案,而不是试图对其进行编辑yours@Snoozer是的,我认为sort永远不会消失(主要是因为它在Wes的书中被广泛使用),但它已经消失了。谢谢我真的需要自动完成我的1000多个熊猫答案!
df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)
import pandas as pd
import numpy as np

np.random.seed(0)

df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)

def pdsort(df1):
    return df1.sort_values(['a', 'b'], ascending=[True, False])

def lex(df1):
    arr = df1.values
    return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])

assert (pdsort(df1).values == lex(df1).values).all()

%timeit pdsort(df1)  # 193 ms per loop
%timeit lex(df1)     # 143 ms per loop