2016-01-31 2 views
2

У меня есть dataframe так:Как отсортировать данные на основе idxmax?

A B C 
0 1 2 1 
1 3 -8 10 
2 10 3 -20 
3 50 7 1 

Я хотел бы изменить ее столбцы, основанные на индексе максимального абсолютного значения в каждом столбце. В столбце A максимальное абсолютное значение находится в строке 3, в B это строка 1, а в C это строка 2, что означает, что моя новая датафрейма должна быть в порядке B C A.

В настоящее время я делаю это следующим образом:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A': [1, 3, 10, 50], 'B': [2, -8, 3, 7], 'C': [1, 10, -20, 1]}) 
indMax = abs(df).idxmax(axis=0) 
df = df[np.argsort(indMax)] 

Так что я сначала определить показатели максимального значения в столбец, которые хранятся в indMax, затем отсортировать его и переставить dataframe соответственно, что дает мне желаемому выход:

B C A 
0 2 1 1 
1 -8 10 3 
2 3 -20 10 
3 7 1 50 

Мой вопрос, есть ли возможность передать функции idxmax непосредственно к sort функции и изменить dataframe inplace ,

ответ

1

IIUC следующее делает то, что вы хотите:

In [69] 

df.ix[:,df.abs().idxmax().sort_values().index] 
Out[69]: 
    B C A 
0 2 1 1 
1 -8 10 3 
2 3 -20 10 
3 7 1 50 

Здесь мы определяем idxmax в abs значений, сортировки значений и передачи индекса к индексу ФР.

Что касается сортировки на месте, вы можете просто назначить обратно df. не

Для предварительно 0.17.0 версии следующих работ:

In [75]: 
df.ix[:,df.abs().idxmax().sort(inplace=False).index] 

Out[75]: 
    B C A 
0 2 1 1 
1 -8 10 3 
2 3 -20 10 
3 7 1 50 
+0

Это дает мне 'AttributeError: объект серии 'не имеет атрибут 'sort_values''. Какую версию панды вы используете? – Cleb

+0

А, последняя версия использует 'sort' вместо – EdChum

+0

Когда я использую' sort', я получаю 'AttributeError: объект 'NoneType' не имеет атрибута 'index'' Кажется, я должен обновить версию pandas ... Ах, неважно, должно проверили ваше редактирование - теперь он отлично работает. Поэтому я выдвигаю его и могу принять его в конце года, в зависимости от качества других ответов. – Cleb

1

Это некрасиво, но это, кажется, работает с использованием reindex_axis:

import numpy as np 

>>> df.reindex_axis(df.columns[list(np.argsort(abs(df).idxmax(axis=0)))], axis=1) 
    B C A 
0 2 1 1 
1 -8 10 3 
2 3 -20  10 
3 7 1 50 
+0

Это действительно работает, поэтому я тоже его продвигаю. Однако версия EdChum - это то, что я имел в виду. – Cleb

+0

:-) Ну, FWIW, я не только думаю, что его ответ здесь лучше - его ответы только лучше в целом. –

+0

Спасибо за альтернативу в любом случае; Мне всегда нравится получать несколько ответов, которые расширяют мои знания :) – Cleb

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