Один неуклюжий метод будет временно добавить значение столбца б 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.0
order
и 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
использование '' df.b.abs() порядок() index'' – Jeff
@Jeff ах..! еще один скрытый камень, спасибо Джеффу будет обновлять – EdChum
Мне бы хотелось увидеть версию этого, которая может сделать это через несколько индексов, так что, например, если index1 может быть либо «Фруктом», либо «Овощи», а index2 - любым фруктом или овощей, а значения - это сумма, потраченная на этот предмет, можно было бы отсортировать кадр данных по абсолютной величине стоимости вида пищи (index1), а затем * затем *, внутренне, стоимостью каждого типа фруктов или овощей. – HaPsantran