假设我有一个包含列a
、b
和c
的数据帧,我想按列b
升序排序,并按列c
降序排序,我该怎么做呢?
发布于 2015-11-21 07:11:35
从pandas 0.17.0开始,DataFrame.sort()
已被弃用,并将在pandas的未来版本中删除。现在,按数据帧的值对其进行排序的方法是DataFrame.sort_values
因此,您的问题的答案现在应该是
df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)
发布于 2018-06-22 18:00:46
对于大数据帧的数字数据,您可以通过numpy.lexsort
看到显著的性能改进,它使用一系列键执行间接排序:
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
只对数值进行排序,而pd.DataFrame.sort_values
则对字符串或数值进行排序。使用带有字符串的np.lexsort
将得到:TypeError: bad operand type for unary -: 'str'
。
https://stackoverflow.com/questions/17141558
复制相似问题