2016-05-10 5 views
3

Я относительно новичок в кадрах данных python и pandas, поэтому, возможно, я пропустил что-то очень простое здесь. Итак, у меня был кадр данных со многими строками и столбцами, но в конце, наконец, удалось получить только одну строку с максимальным значением из каждого столбца. Я использовал этот код, чтобы сделать это:Как отсортировать данные по значениям столбцов?

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 (ось = 1), но ничего не происходит.

Edit: Ok, я нашел один способ, но с преобразованием:

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

Является ли это единственно возможный способ сделать это?

ответ

5

Вы можете использовать max с nlargest, потому что 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 

EDIT:

Если вам нужно сортировать одну строку 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

Ммм, я, кажется, нашел решение без транспозиции. Plese check edit. – jezrael

+0

Ничего себе так просто! Большое спасибо! –

+0

Спасибо за эту ссылку также :) Я думал, стрелка вверх, все, что я могу сделать, чтобы подтвердить, что ответ хороший, теперь я нажал также знак Accept. Еще раз спасибо jezrael –

Смежные вопросы