

pandas.DataFrame は表形式のデータを扱うのに便利である。
表形式のデータを扱っていると、ときにはデータ順をソートしたくなる。
データフレームのソートは df.sort_values() で行うのだが、df.sort_values("列名") では一つのカラムに対してしかソートできない。
複数のカラムに対してソートしたい場合はどうすればいいのか。
そこで今回はpandas.DataFrameで複数カラムでソートする方法について紹介する。
この記事を書いている人

記事を読むメリット
pandas.DataFrameで複数カラムでソートする方法がわかり、pandasでデータをソートするのが得意になる
データ準備

まずはソートするデータを準備する。
今回は以下のデータを例に解説する。
DATA
import pandas as pd
data_list1 = [
["a",12,100],
["b",12,105],
["c",12,90],
["d",13,85],
["e",13,90],
["f",14,95],
["g",11,90]
]
col_list1 = ["id","age","score"]
df1 = pd.DataFrame(data=data_list1, columns=col_list1)
print(df1)
# id age score
# 0 a 12 100
# 1 b 12 105
# 2 c 12 90
# 3 d 13 85
# 4 e 13 90
# 5 f 14 95
# 6 g 11 90
pandas.DataFrameでソートする方法

単純にソートする場合は sort_values() を引数に列名を指定して実行する。
SAMPLE
print(df1.sort_values("score"))
# id age score
# 3 d 13 85
# 2 c 12 90
# 4 e 13 90
# 6 g 11 90
# 5 f 14 95
# 0 a 12 100
# 1 b 12 105
ただ見ての通り、 score のカラムに対してソートしても同値の行が存在する場合は他の列の値がバラバラの順になってしまう。

pandas.DataFrameで複数カラムでソートする方法

pandas.DataFrameで複数カラムでソートするには sort_values() の引数に by=["列名1","列名2"] とリストで指定してやれば良い。
SAMPLE
print(df1.sort_values(by=["score","age"])) # id age score # 3 d 13 85 # 6 g 11 90 # 2 c 12 90 # 4 e 13 90 # 5 f 14 95 # 0 a 12 100 # 1 b 12 105
今度は score と age でソートしたので同じscore値が居てもその中でさらにage順に並ぶのでキレイに揃った。
複数カラムの昇順、降順を指定する方法

複数カラムに対してソートはできた。
では片方だけ降順にしたい場合はどうすればいいのか。
昇順降順の指定には ascending パラメータを指定する。
使い方は以下の通り。
SAMPLE
print(df1.sort_values(by=["score","age"], ascending=[False,True])) # id age score # 1 b 12 105 # 0 a 12 100 # 5 f 14 95 # 6 g 11 90 # 2 c 12 90 # 4 e 13 90 # 3 d 13 85
複数カラムソートと同じように、ascending=[False,True] と各カラムに対応する昇順フラグをbool値で指定するとカラム毎の昇順降順指定ができる。
ちなみに ascending は「昇順」を意味するので True だと昇順(小さい順)になり、 False だと降順(大きい順)になる。
indexを振り直すならreset_index
ちなみに
ソートしたデータフレームに対してインデックスを振り直すなら reset_index() をする。
SAMPLE
df2 = df1.copy().sort_values(by=["score","age"], ascending=[False,True]) df2 = df2.reset_index(drop=True) print(df2) # id age score # 0 b 12 105 # 1 a 12 100 # 2 f 14 95 # 3 g 11 90 # 4 c 12 90 # 5 e 13 90 # 6 d 13 85
まとめ

今回はpandas.DataFrameで複数カラムでソートする方法について解説した。
pandas.DataFrameで複数カラムでソートするには、sort_values() の引数に by=["列名1","列名2"] とリストでカラム指定するとソートできる。
またカラム毎の昇順降順を指定するには ascending=[False,True] のように各カラムに対応する昇順フラグをbool値で指定すると良い。

他にもpandas関連の記事もあるので、もし気になったら見てみて欲しい。



