![](/img/trans.png)
[英]Pandas - How to sort_values by 2 different columns using 2 different keys
[英]Sort all columns of a pandas DataFrame independently using 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函数的情况下以pandas方式对数据框中的所有列进行排序?
您可以将numpy.sort
与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_values
将按照传递给它的列顺序对整个数据框进行排序。 在您的第一个示例中,您使用['a', 'b', 'c']
对整个数据框进行排序。 这首先按'a'
排序,然后按'b'
排序,最后按'c'
排序。
请注意,在按a
排序后,行保持相同。 这是预期的结果。
使用lambda
将每列传sort_values
它,这意味着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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.