2017-04-07 36 views
3

獨立排序一個pandas DataFrame的所有列我有一個數據框,並希望按降序或升序獨立排序所有列。使用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 

我可以得到想要的結果,如果我使用該解決方案從this答案它應用了一個λ函數:

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方式對數據框中的所有列進行排序?

回答

5

您可以使用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 
+0

謝謝您的回答。但是我仍然更喜歡'df.apply(lambda x:x.sort_values()。values)',因爲它更短,並且不需要numpy導入。 –

+0

這是不是有一些標準的熊貓構造? ;) –

+5

@CordKaldemeyer在使用熊貓時避免使用'numpy'導入時應避免使用'numpy'。那是因爲你輸入'pandas'的乳清你已經輸入'numpy'。事實上,你可以使用'pandas'命名空間來完成jezrael的功能。 'pd.DataFrame(pd.np.sort(df.values,axis = 0),index = df.index,columns = df.columns)' – piRSquared

4

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 
+0

感謝您的解釋!所以它的工作原理和SQL一樣.. –

+0

@CordKaldemeyer編輯時使用了不使用lambda或numpy的'df'排序新方法。 –

+0

感謝你們的幫助和解釋! –