pandas.DataFrame, Seriesをソートするsort_values, sort_index
pandas.DataFrame
, pandas.Series
をソート(並び替え)するには、sort_values()
, sort_index()
メソッドを使う。昇順・降順を切り替えたり、複数列を基準にソートしたりできる。
なお、古いバージョンにあったsort()
メソッドは廃止されているので注意。
ここでは以下の内容について説明する。
- 要素でソートする
sort_values()
- 昇順、降順(引数
ascending
) - 複数列を基準にソート
- 欠損値
NaN
の扱い(引数na_position
) - 元のオブジェクトを変更(引数
inplace
) - 行方向にソート(引数
axis
)
- 昇順、降順(引数
- インデックス(行名・列名)でソートする
sort_index()
- 行名
index
でソート - 昇順、降順(引数
ascending
) - 元のオブジェクトを変更(引数
inplace
) - 列名
columns
でソート(引数axis
)
- 行名
昇順・降順に並べ替えるのではなく、昇順・降順に順位付けした結果を得たい場合はrank()
を使う。
行名・列名を指定して任意の順番に並べ替えるにはreindex()
を使う。
都道府県名を都道府県コード順にソートするといった、任意のルールに従って並べ替えたい場合は以下の記事を参照。
また、n個の最大値・最小値(大きい方からn個、小さい方からn個)を含む行・要素を取り出すnlargest()
, nsmallest()
メソッドもある。
ここでは、例として以下のデータを使用する。
import pandas as pd
df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
サンプルのcsvファイルはコチラ。
例はpandas.DataFrame
だが、pandas.Series
でもsort_values()
とsort_index()
が用意されているので、使い方は同じ。
要素でソートするsort_values()
要素の値に応じてソートするにはsort_values()
メソッドを使う。
ソートしたい列のラベル(列名)を第一引数(by
)に指定する。
df_s = df.sort_values('state')
print(df_s)
# name age state point
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
# 0 Alice 24 NY 64
# 5 Frank 30 NY 57
# 3 Dave 68 TX 70
sort_value()
でバラバラになったインデックスを新たに振り直すにはreset_index()
を使う。
昇順、降順(引数ascending)
デフォルトは昇順。降順にしたい場合は引数ascending
をFalse
にする。
df_s = df.sort_values('state', ascending=False)
print(df_s)
# name age state point
# 3 Dave 68 TX 70
# 0 Alice 24 NY 64
# 5 Frank 30 NY 57
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
複数列を基準にソート
第一引数by
をリストで指定すると、複数列を基準にソートできる。
リストの後ろから順番にソートされていくイメージ。最後にリストの最初の列でソートされる。
df_s = df.sort_values(['state', 'age'])
print(df_s)
# name age state point
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
# 1 Bob 42 CA 92
# 0 Alice 24 NY 64
# 5 Frank 30 NY 57
# 3 Dave 68 TX 70
df_s = df.sort_values(['age', 'state'])
print(df_s)
# name age state point
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
# 0 Alice 24 NY 64
# 5 Frank 30 NY 57
# 1 Bob 42 CA 92
# 3 Dave 68 TX 70
引数ascending
をリストで指定すると、それぞれの列に対して昇順・降順を選択することができる。
df_s = df.sort_values(['age', 'state'], ascending=[True, False])
print(df_s)
# name age state point
# 2 Charlie 18 CA 70
# 0 Alice 24 NY 64
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
# 1 Bob 42 CA 92
# 3 Dave 68 TX 70
欠損値NaNの扱い(引数na_position)
欠損値NaN
がある場合、デフォルトでは末尾に並べられる。
df_nan = df.copy()
df_nan.iloc[:2, 1] = pd.np.nan
print(df_nan)
# name age state point
# 0 Alice NaN NY 64
# 1 Bob NaN CA 92
# 2 Charlie 18.0 CA 70
# 3 Dave 68.0 TX 70
# 4 Ellen 24.0 CA 88
# 5 Frank 30.0 NY 57
df_nan_s = df_nan.sort_values('age')
print(df_nan_s)
# name age state point
# 2 Charlie 18.0 CA 70
# 4 Ellen 24.0 CA 88
# 5 Frank 30.0 NY 57
# 3 Dave 68.0 TX 70
# 0 Alice NaN NY 64
# 1 Bob NaN CA 92
引数na_position='first'
とすると先頭に並べられる。
df_nan_s = df_nan.sort_values('age', na_position='first')
print(df_nan_s)
# name age state point
# 0 Alice NaN NY 64
# 1 Bob NaN CA 92
# 2 Charlie 18.0 CA 70
# 4 Ellen 24.0 CA 88
# 5 Frank 30.0 NY 57
# 3 Dave 68.0 TX 70
欠損値を削除したり別の値に置換したりする場合は以下の記事を参照。
元のオブジェクトを変更(引数inplace)
デフォルトではソートされた新たなオブジェクトが返されるが、引数inplace
をTrue
とすると、元のオブジェクト自体が変更される。
df.sort_values('state', inplace=True)
print(df)
# name age state point
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
# 0 Alice 24 NY 64
# 5 Frank 30 NY 57
# 3 Dave 68 TX 70
行方向にソート(引数axis)
これまでの例のように、デフォルトでは列方向(縦方向)にソートされる。
行方向にソートしたい場合は引数axis
を1
とする。その他の引数はこれまでの例と同様。
数値と文字列が混在しているとエラーになるので、ここでは文字列の列を削除して数値の列のみにして例示している。drop()
メソッドについては以下の記事参照。
df_d = df.drop(['name', 'state'], axis=1)
print(df_d)
# age point
# 1 42 92
# 2 18 70
# 4 24 88
# 0 24 64
# 5 30 57
# 3 68 70
df_d .sort_values(by=1, axis=1, ascending=False, inplace=True)
print(df_d)
# point age
# 1 92 42
# 2 70 18
# 4 88 24
# 0 64 24
# 5 57 30
# 3 70 68
インデックス(行名・列名)でソートするsort_index()
インデックス(行名・列名)でソートするにはsort_index()
メソッドを使う。
行名indexでソート
sort_index()
ではデフォルトで行名に従って列方向(縦方向)にソートされる。
print(df)
# name age state point
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
# 0 Alice 24 NY 64
# 5 Frank 30 NY 57
# 3 Dave 68 TX 70
df_s = df.sort_index()
print(df_s)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
昇順、降順(引数ascending)
sort_values()
と同じく、デフォルトは昇順。降順にしたい場合は引数ascending
をFalse
にする。
df_s = df.sort_index(ascending=False)
print(df_s)
# name age state point
# 5 Frank 30 NY 57
# 4 Ellen 24 CA 88
# 3 Dave 68 TX 70
# 2 Charlie 18 CA 70
# 1 Bob 42 CA 92
# 0 Alice 24 NY 64
元のオブジェクトを変更(引数inplace)
sort_values()
と同じく、引数inplace
を指定できる。True
とすると元のオブジェクトが変更される。
df.sort_index(inplace=True)
print(df)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
列名columnsでソート(引数axis)
こちらもsort_values()
と同じく、引数axis=1
とすると、列名に従って行方向(横方向)にソートされる。その他の引数もこれまでの例と同様に使える。
df_s = df.sort_index(axis=1)
print(df_s)
# age name point state
# 0 24 Alice 64 NY
# 1 42 Bob 92 CA
# 2 18 Charlie 70 CA
# 3 68 Dave 70 TX
# 4 24 Ellen 88 CA
# 5 30 Frank 57 NY
df.sort_index(axis=1, ascending=False, inplace=True)
print(df)
# state point name age
# 0 NY 64 Alice 24
# 1 CA 92 Bob 42
# 2 CA 70 Charlie 18
# 3 TX 70 Dave 68
# 4 CA 88 Ellen 24
# 5 NY 57 Frank 30