如何按两列或多列对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