簡體   English   中英

使用sort_values()獨立地對pandas DataFrame的所有列進行排序

[英]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.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它,這意味着sort_values將應用於單個列,這就是為什么第二種方法按預期對列進行排序的原因。 在這種情況下,行會改變。

如果你不想使用lambdanumpy你可以使用它:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM