web-dev-qa-db-ja.com

データを変更せずに絶対値でソートする

特定の列の絶対値でpandasデータフレームを並べ替える簡単な方法を探していますが、データフレーム内の値を実際に変更することはありません。sorted(df, key=abs)。したがって、次のようなデータフレームがある場合:

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

「b」でソートした場合の結果のソート済みデータは次のようになります。

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

[〜#〜] update [〜#〜]

0.17.0ordersortは非推奨になりました(@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
31
EdChum

より慣用的なパンダに向けて:argsortを使用

より明確なアプローチは、絶対値で _Series.argsort_ を呼び出してから、インデックスを作成することです。

_df.iloc[df['b'].abs().argsort()]

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

インデックスをリセットする必要がある場合は、 _Series.reset_index_ を使用します。

_df.iloc[df['b'].abs().argsort()].reset_index(drop=True)

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

最後に、argsortには昇順/降順の指定へのascendingパラメーターがないため、否定する必要があります。 df['b'].abs()は降順でソートします。

_df.iloc[(-df['b'].abs()).argsort()]

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

NumPyでもこれを行うことができます。 _np.abs_ および _ndarray.argsort_ を使用します。

_df.iloc[np.abs(df['b'].values).argsort()]

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

または、descending順序の場合、

_df.iloc[(-np.abs(df['b'].values)).argsort()]

   a  b
4  5 -9
1  2  5
0  1 -3
3  4  2
2  3 -1
_
6
cs95