特定の列の絶対値で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
[〜#〜] update [〜#〜]
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
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
_