2013-04-12 2 views
1

Скажем, у меня есть dataframe:Сортировка этикеток в строке/столбце

df = pandas.DataFrame(np.random.randn(5,3), 
columns = ['A','B','C'], 
index = ['r0', 'r1', 'r2', 'r3', 'r4') 

      A   B   C 
r0 -0.830305 -0.395235 0.589917 
r1 -1.378534 -0.484204 -1.068907 
r2 -0.407720 1.922942 -1.120012 
r3 1.075495 0.968913 1.509079 
r4 -2.858858 1.018327 -0.660672 

Я хотел бы получить новый кадр данных, где для каждой строки, у меня есть список имен столбцов, отсортированных по значению.

Для приведенного выше примера, результат сортировки в descending order по столбцам будет:

0 1 2 
r0 C B A 
r1 A B C 
r2 B A C 
r3 C A B 
r4 B C A 

Есть ли «Панды/NumPy» способ сделать это?

ответ

2

Один из способов заключается в использовании метода order серии по каждой строке (и взять индекс):

In [11]: df 
Out[11]: 
      A   B   C 
r0 0.213505 -0.661328 1.489605 
r1 -1.096459 -0.373994 -1.948745 
r2 0.380518 -1.424787 -0.639996 
r3 -0.327361 1.029477 0.153808 
r4 -0.593371 0.112844 0.096872 

In [12]: df.apply(lambda row: row.order(ascending=False).index, axis=1) 
Out[12]: 
    A B C 
r0 C A B 
r1 B A C 
r2 A C B 
r3 B C A 
r4 B C A 

Чтобы разбить его:

In [21]: row = df.ix[0] 

In [22]: row 
Out[22]: 
A 0.213505 
B -0.661328 
C 1.489605 
Name: r0 

In [23]: row.order(ascending=False) 
Out[23]: 
C 1.489605 
A 0.213505 
B -0.661328 
Name: r0 

In [24]: row.order(ascending=False).index 
Out[24]: Index([C, A, B], dtype=object) 
+0

Я думаю, что мне нравится это лучше, чем у меня. – DSM

+1

'В [12]' возвращает следующее: '/opt/Python-2.7.3-x86_64/lib/python2.7/site-packages/pandas-0.10.1-py2.7-linux-x86_64.egg/pandas /core/frame.py:3576: FutureWarning: переименовать с inplace = True вернет None из pandas 0.11 onward "from pandas 0.11 onward", FutureWarning) 'Что это значит? Будет ли код, который вы написали, совместим с '0.11'? –

+0

@ user815423426 он работает (без предупреждения) на 0.11 dev. Что касается того, почему вы это видите: хороший вопрос (поскольку мы не вызываем переименование) ... Будет [изменение API] (http://pandas.pydata.org/pandas-docs/dev/whatsnew. html), где многие функции при вызове с inplace = True возвращают None (а не вывод). Поскольку мы не используем inplace = True, это не проблема. –