2016-05-10 21 views
3

我對Python和熊貓數據框架相對較新,所以也許我錯過了一些非常簡單的東西。 所以我有很多行和列的數據框,但最後終於設法從每列中獲得最大值的只有一行。我用這個代碼來做到這一點:如何按列值對數據框排序?

import pandas as pd 

d = {'A' : [1.2, 2, 4, 6], 
    'B' : [2, 8, 10, 12], 
    'C' : [5, 3, 4, 5], 
    'D' : [3.5, 9, 1, 11], 
    'E' : [5, 8, 7.5, 3], 
    'F' : [8.8, 4, 3, 2]} 


df = pd.DataFrame(d, index=['a', 'b', 'c', 'd']) 
print df 

Out: 
    A B C  D E F 
a 1.2 2 5 3.5 5.0 8.8 
b 2.0 8 3 9.0 8.0 4.0 
c 4.0 10 4 1.0 7.5 3.0 
d 6.0 12 5 11.0 3.0 2.0 

然後選擇從每列我用這個函數最大值:

def sorted(s, num): 
    tmp = s.order(ascending=False)[:num] 
    tmp.index = range(num) 
    return tmp 

NewDF=df.apply(lambda x: sorted(x, 1)) 
print NewDF 

Out: 
    A B C  D E F 
0 6.0 12 5 11.0 8.0 8.8 

是的,我失去了行標籤(索引等等),但此列標籤對我來說更重要的是保留。現在我只需要我列需要根據它們內部值前5列進行排序,我需要這樣的輸出:

Out: 
    B  D F E A  
0 12.0 11 8.8 8.0 6.0 

我一直在尋找一個解決方案,但沒有運氣。我發現按列排序的最好方法是打印NewDF.sort(axis = 1),但沒有任何反應。

編輯: 好吧,我發現了一個方法,但與轉型:

transposed = NewDF.T 
print(transposed.sort([0], ascending=False)) 

這是唯一可行的辦法做到這一點?

回答

5

您可以使用maxnlargest,因爲nlargest各種輸出:

print df.max().nlargest(5) 
B 12.0 
D 11.0 
F  8.8 
E  8.0 
A  6.0 
dtype: float64 

然後轉換爲DataFrame

print pd.DataFrame(df.max().nlargest(5)).T 
     B  D F E A 
0 12.0 11.0 8.8 8.0 6.0 

編輯:

如果需要排序一個DataFrame一行:

print NewDF.T.sort_values(0, ascending=False) 
     0 
B 12.0 
D 11.0 
F 8.8 
E 8.0 
A 6.0 
C 5.0 

另一種解決方案是applysort_values

print NewDF.apply(lambda x: x.sort_values(ascending=False), axis=1) 
     B  D F E A C 
0 12.0 11.0 8.8 8.0 6.0 5.0 
+0

嗯,看來我找到了解決方案,無需調換。請檢查編輯。 – jezrael

+0

太容易了!非常感謝! –

+0

感謝您的參考也:)我想起箭頭是我可以做的確認答案是好的,現在我點擊接受標記也。再次感謝jezrael –