2015-05-27 2 views
9

Я ищу простой способ сортировки данных в формате pandas по абсолютному значению определенного столбца, но без фактического изменения значений в пределах данных. Нечто похожее на sorted(df, key=abs). Так что, если у меня был dataframe как:pandas - сортировать по абсолютной величине без изменения данных

a b 
0 1 -3 
1 2 5 
2 3 -1 
3 4 2 
4 5 -9 

в результате сортировки данных при сортировке по «Ъ» будет выглядеть следующим образом:

a b 
2 3 -1 
3 4 2 
0 1 -3 
1 2 5 
4 5 -9 

ответ

11

Один неуклюжий метод будет временно добавить значение столбца б abs , то sort используя этот столбец, а затем drop это:

In [162]: 
df['sort'] = df.b.abs() 
df.sort(columns='sort').drop('sort', axis=1) 

Out[162]: 
    a b 
2 3 -1 
3 4 2 
0 1 -3 
1 2 5 
4 5 -9 

в качестве альтернативы можно взять вид на abs значений «Ъ», называют sort на него, а затем вызвать reindex передавая индекс серии:

In [176]: 
t = df.b.abs() 
t.sort() 
df.reindex(t.index) 

Out[176]: 
    a b 
2 3 -1 
3 4 2 
0 1 -3 
1 2 5 
4 5 -9 

EDIT

выше может быть сделано как однострочника:

In [179]: 
df.reindex(df.b.abs().sort(inplace=False).index) 

Out[179]: 
    a b 
2 3 -1 
3 4 2 
0 1 -3 
1 2 5 
4 5 -9 

sort по умолчанию inplace=True так явно передается inplace=False вернет серию.

Другой редактировать

Благодаря мастер @Jeff для этого неизвестного метода (для меня в любом случае), вы можете вызвать order на результат abs, что приводит к чистому коду:

In [31]: 
df.reindex(df.b.abs().order().index) 

Out[31]: 
    a b 
2 3 -1 
3 4 2 
0 1 -3 
1 2 5 
4 5 -9 

ОБНОВЛЕНИЕ

С 0.17.0order и sort устарели (спасибо @Ruggero Turra), вы можете использовать sort_values для достижения этой цели в настоящее время:

In[16]: 

df.reindex(df.b.abs().sort_values().index) 
Out[16]: 
    a b 
2 3 -1 
3 4 2 
0 1 -3 
1 2 5 
4 5 -9 
+5

использование '' df.b.abs() порядок() index'' – Jeff

+0

@Jeff ах..! еще один скрытый камень, спасибо Джеффу будет обновлять – EdChum

+0

Мне бы хотелось увидеть версию этого, которая может сделать это через несколько индексов, так что, например, если index1 может быть либо «Фруктом», либо «Овощи», а index2 - любым фруктом или овощей, а значения - это сумма, потраченная на этот предмет, можно было бы отсортировать кадр данных по абсолютной величине стоимости вида пищи (index1), а затем * затем *, внутренне, стоимостью каждого типа фруктов или овощей. – HaPsantran