こんにちは!インストラクターのフクロウです!listやnp.araryにはsort関数が用意されていましたね。これに対応するソート機能がPandasのDataFrameにも用意されています!
sort_values, sort_indexの2つのメソッドを駆使して、データフレームを自由自在にソートする方法をこの記事で勉強していきましょう!
Pandasのデータをソートする2つのメソッド
pandasのDataFrameやSeriesなどをソートする主なメソッドは
- sort_values:要素の値に沿ってソート」
- sort_index:行や列の名前(インデックス)に沿ってソート
の2つです。それぞれがどんな使い方をするのかを見ていきましょう!
df.sort_values
DataFrameなどを要素の値に沿ってソートするメソッドです。いろいろ機能がついているので、入門者に知ってもらいたいメインの機能を掻い摘んで解説しますよ!!実際に使って試してみましょう!
データの準備
まずは解説に使うデータフレームを作りますよ!簡単に、iris datasetを読み込んでおきましょう。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
In [2]:
iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df["label"] = [iris.target_names[i] for i in iris.target] df.head(10)
このままでもいいんですが、どうせならシャッフルしてソートしがいのあるデータフレームを用意しましょう!
df = df.sample(frac=1, random_state=0)
df.head(10)
行のインデックスがぐちゃぐちゃになっていることがわかりますね。それではこれをsortしていきましょう。
基準になる列を指定してソート
df.sort_valuesでは、ソートの基準になる列の名前を指定する必要がありますよ!
sorted_df = df.sort_values("petal width (cm)")
sorted_df.head(10)
ソート結果のデータフレームを見てみて下さい。petal width (cm)の列を順にソートしていることがわかります。ですが同じ0.1という値のデータが複数個あって、もっとソートの基準を増やしたくないですか?
そんなとき、df.sort_valuesではリストで列名を複数指定することで、ソートの基準を増やすことができます。
sorted_df = df.sort_values(["petal width (cm)", "petal length (cm)"])
sorted_df.head(10)
こうすることで、基本的にはpetal width (cm)列でソートして、同じ値のデータが出てきたときはpetal length (cm)の大小関係でソートすることができます。こうして条件を増やすことで、期待通りのソートができそうです!
ソート対象のオブジェクト自体を変更
さて、実はこのsort_values、もとのオブジェクト(ここだとdf)が変更されてないんですよ。
# 上でソートを適用したはずのdfを見てみよう
df.head(10)
前の章でソートしたsorted_dfの表と見比べてみてください。もとのオブジェクトであるdfはソートされていないことがわかります。
さて、もし元のオブジェクト(df)自体を変更したい場合、inplaceパラメータを使います。
df.sort_values(["petal width (cm)", "petal length (cm)"],
inplace=True # Trueだと元の値を変更(指定しない場合はFalseになっている)
)
df.head(10)
元のデータフレーム自体を変更することが簡単にできました。このような元のオブジェクト自体を変更する操作のことを破壊的変更といいます。
パラメータで指定しなければ普通は非破壊なので、ソートしたと思って元の配列を操作するようなことがないように注意したいですね。
昇順・降順
sort_valuesでは、指定しなければ昇順でソートしてくれます(これは他の多くのsort関数でも同じです)。これを逆に降順にしたい場合は、ascendingパラメータを使います。
※ascending
主な意味:のぼっていく、上昇的な
引用元:weblio https://ejje.weblio.jp/content/ascending
df.sort_values(["petal length (cm)"],
inplace=True, # Trueだと元の値を変更(指定しない場合はFalseになっている)
ascending=False # Trueだと昇順、Falseだと降順(指定しない場合はTrue)
)
df.head(10)
df.sort_index
DataFrameなどを行や列の名前(インデックス)に沿ってソートするメソッドです。
行の名前に従ってソート
何も指定しなければ、行の名前(ここだと0~149までのインデックスが割り振られています)に沿ってソートしてくれます。
sorted_df = df.sort_index()
sorted_df.head(10)
列の名前に従ってソート
行ができれば列でもできる!axis=1で列を列名のアルファベット順にソートしてくれます。
df.sort_index(axis=1, # axis=1で列をソート
inplace=True # sort_valesのようにinplaceやascendingパラメータもあります。
)
df.head(10)
まとめ
この記事では、DataFrameをソートする2つのメソッド「df.sort_values, df.sort_index」を解説しました!エクセルのsortのような操作がpandasでも簡単に実現できました。
注意点としては、pandas.sort* のように関数で用意されているわけではなく、pandas.DataFrame.sort* のようにメソッドとして提供されているところです。使い方は案外簡単ですし、データの前処理に大活躍しそうですね!