Python 使用Sort_values()对数据帧的所有列进行独立排序

Python 使用Sort_values()对数据帧的所有列进行独立排序,python,pandas,Python,Pandas,我有一个dataframe,希望以降序或升序对所有列进行独立排序 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 当我使用它时,它不会按预期工作(对我而言),只对一

我有一个dataframe,希望以降序或升序对所有列进行独立排序

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
当我使用它时,它不会按预期工作(对我而言),只对一列进行排序:

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
如果我使用answer中应用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
但这在我看来有点笨手笨脚

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

您可以使用
dataframe
构造函数:

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_value
将按照传递给整个数据帧的列顺序对其进行排序。在第一个示例中,您使用
['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

谢谢你的回答。但是我还是更喜欢
df.apply(lambda x:x.sort_values().values)
而不是它,因为它比较短并且不需要numpy导入。这不是有一些标准的pandas构造吗?;)@CordKaldemeyer在使用pandas以避免导入
numpy
时,应该没有任何首选项来避免
numpy
。这是因为您导入的
pandas
乳清已经导入了
numpy
。事实上,您可以使用
pandas
名称空间来完成jezrael所做的事情
pd.DataFrame(pd.np.sort(df.values,axis=0),index=df.index,columns=df.columns)
@piRSquared谢谢您的评论。如果使用此解决方案,我认为在较大的df中应用此解决方案会更快。但两者都很好用。在我看来,如果不是相同的数据类型的列,应用解决方案会更好,例如一个ic字符串,另一个int,float。因为numpy最适用于float,int数组-相同的数据类型。@Cordkaldemyer使用新的排序方式编辑
df
,而不使用
lambda
numpy
。感谢你们两位的帮助和解释!