note.nkmk.me

pandas.DataFrame, Seriesをソートするsort_values, sort_index

Date: 2018-01-13 / tags: Python, pandas
このエントリーをはてなブックマークに追加

pandas.DataFrame, pandas.Seriesをソート(並び替え)するには、sort_values(), sort_index()メソッドを使う。昇順・降順を切り替えたり、複数列を基準にソートしたりできる。

なお、古いバージョンにあったsort()メソッドは廃止されているので注意。

昇順・降順に並び替えるのではなく、昇順・降順に順位付けした結果を得たい場合はrank()メソッドを使う。以下の記事を参照。

ここでは、例として以下のデータを使用する。

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

昇順、降順(引数ascending)

デフォルトは昇順。降順にしたい場合は引数ascendingFalseにする。

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

元のオブジェクトを変更(引数inplace)

デフォルトではソートされた新たなオブジェクトが返されるが、引数inplaceTrueとすると、元のオブジェクト自体が変更される。

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)

これまでの例のように、デフォルトでは列方向(縦方向)にソートされる。

行方向にソートしたい場合は引数axis1とする。その他の引数はこれまでの例と同様。

数値と文字列が混在しているとエラーになるので、ここでは文字列の列を削除して数値の列のみにして例示している。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()メソッドを使う。

行名でソート

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()と同じく、デフォルトは昇順。降順にしたい場合は引数ascendingFalseにする。

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

列名でソート(引数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
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事