Python

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

pandasのデータフレームで複数カラムでソートするにはどうしたらいいんだっけ?


pandas.DataFrame は表形式のデータを扱うのに便利である。

表形式のデータを扱っていると、ときにはデータ順をソートしたくなる

データフレームのソートは df.sort_values() で行うのだが、df.sort_values("列名") では一つのカラムに対してしかソートできない。

複数のカラムに対してソートしたい場合はどうすればいいのか。

そこで今回はpandas.DataFrameで複数カラムでソートする方法について紹介する。

この記事を書いている人


システムエンジニア、AIエンジニアと、IT業界で10年以上働いている中堅。PythonとSQLが得意。

記事を読むメリット

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


今度は scoreage でソートしたので同じ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関連の記事もあるので、もし気になったら見てみて欲しい。

ITipsと同じようなブログを作る方法

ブログに興味がありますか?

もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

ランキング参加中

にほんブログ村 IT技術ブログへ

他にもブログやSNSで紹介してくれると励みになります。

はてブのコメントで酷評されると泣きます(´;ω;`)

-Python
-

© 2022 ITips