使用 sort_values() 独立对熊猫数据帧的所有列进行排序



我有一个数据帧,想按降序或升序独立地对所有列进行排序。

import pandas as pd
data = {'a': [5, 2, 3, 6],
        'b': [7, 9, 1, 4],
        'c': [1, 5, 4, 2]}
df = pd.DataFrame.from_dict(data)
   a  b  c
0  5  7  1
1  2  9  5
2  3  1  4
3  6  4  2

当我为此使用 sort_values(( 时,它没有按预期工作(对我来说(,并且只对一列进行排序:

foo = df.sort_values(by=['a', 'b', 'c'], ascending=[False, False, False])
   a  b  c
3  6  4  2
0  5  7  1
2  3  1  4
1  2  9  5

如果我使用这个答案中应用 lambda 函数的解决方案,我可以得到想要的结果:

bar = df.apply(lambda x: x.sort_values().values)
print(bar)
   a  b  c
0  2  1  1
1  3  4  2
2  5  7  4
3  6  9  5

但这对我来说看起来有点沉重。

上面的 sort_values(( 示例中实际发生了什么,如何在没有 lambda 函数的情况下以熊猫方式对数据帧中的所有列进行排序?

您可以将

numpy.sortDataFrame构造函数一起使用:

df1 = pd.DataFrame(np.sort(df.values, axis=0), index=df.index, columns=df.columns)
print (df1)
   a  b  c
0  2  1  1
1  3  4  2
2  5  7  4
3  6  9  5

编辑:

按降序回答:

arr = df.values
arr.sort(axis=0)
arr = arr[::-1]
print (arr)
[[6 9 5]
 [5 7 4]
 [3 4 2]
 [2 1 1]]
df1 = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df1)
   a  b  c
0  6  9  5
1  5  7  4
2  3  4  2
3  2  1  1

sort_values将按您传递给它的列顺序对整个数据框进行排序。在第一个示例中,您将使用 ['a', 'b', 'c'] 对整个数据框进行排序。这将首先按'a'排序,然后按'b'排序,最后按'c'排序。

请注意,在按a排序后,行如何保持相同。这是预期的结果。

使用lambda将每一列传递给它,这意味着sort_values将应用于单个列,这就是为什么第二种方法按预期对列进行排序的原因。在这种情况下,行会更改。

如果您不想使用lambda也不想使用numpy可以使用以下内容:

pd.DataFrame({x: df[x].sort_values().values for x in df.columns.values})

输出:

   a  b  c
0  2  1  1
1  3  4  2
2  5  7  4
3  6  9  5

最新更新