データの順番を並び替えたいことってありますよね。
pandasには順番を並び替える関数として、pandas.sort_valuse()とpandas.sort_index()の2つがあります。
本記事ではソート関数の説明と使い方について、例を用いながらわかりやすく解説していきます。
pandas.sort関数について
pandas.sott()は昔のバージョンにあった関数で、新しいバージョンでは使用できません。
代わりにpandas.sort_values()とpandas.sort_index()が用意されています。
値で並び替えたい場合はpandas.sort_values()、インデックスで並び替えたい時はpandas.sort_index()を使います。
本記事のコードはグーグルコラボラトリーで実行・確認しています。
pandas.sort_values()の使い方
始めにpandas.sort_values()の使い方を見ていきましょう。
準備
始めにpandasライブラリのインポートと、今回使用するDataFrameを用意しましょう。
DataFrameは果物の名前、重さと価格が書かれています。
import pandas as pd
df1 = pd.DataFrame({
'fruits': ['Apple', 'Grape', 'Cherry','Banana', 'Cherry'],
'weight': [100, 200, 150, 50, 300],
'plice': [100, 150, 400, 100, 200]
})
df1
出力:
index | fruits | weight | plice |
---|---|---|---|
0 | Apple | 100 | 100 |
1 | Grape | 200 | 150 |
2 | Cherry | 150 | 400 |
3 | Banana | 50 | 100 |
4 | Cherry | 300 | 200 |
基本的な使い方
pandas.sort_valuesは指定した軸に沿って並べ替えます。
ソートしたい列名を指定することで使用可能です。df1を果物の名前で並べ替えてみましょう。
df1.sort_values('fruits')
出力:
index | fruits | weight | plice |
---|---|---|---|
0 | Apple | 100 | 100 |
3 | Banana | 50 | 100 |
2 | Cherry | 150 | 400 |
4 | Cherry | 300 | 200 |
1 | Grape | 200 | 150 |
‘fruits’列の昇順(A→Z)に沿ってデータが並び変わりました。
pandas.sort_valuesは複数の列を指定してソートすることも可能です。果物名と価格の2つを指定してみましょう。
複数の列名でソートしたい時は、リストで指定してください。
df1.sort_values(['fruits', 'plice'])
出力:
index | fruits | weight | plice |
---|---|---|---|
0 | Apple | 100 | 100 |
3 | Banana | 50 | 100 |
4 | Cherry | 300 | 200 |
2 | Cherry | 150 | 400 |
1 | Grape | 200 | 150 |
‘fruits’ のソート条件が最優先されて、2つデータがあるCherryの順番が ‘plice’の値によって並び替えられました。
指定する列名の順番を変えたらどうなるでしょう?
df1.sort_values(['plice', 'fruits'])
出力:
index | fruits | weight | plice |
---|---|---|---|
0 | Apple | 100 | 100 |
3 | Banana | 50 | 100 |
1 | Grape | 200 | 150 |
4 | Cherry | 300 | 200 |
2 | Cherry | 150 | 400 |
‘price’のソートが最優先されて、同じ値であるAppleとBananaが’fruits’でソートされました。
左側に指定した列名が優先されていますね。
pandas.sort_valuesの引数
ここからはpandas.sort_values()で使用可能な引数について説明していきます。
並び替える軸の指定: axis
pandas.sort_values()は指定した列に沿ってソートする関数だと説明しました。
もし行に沿って並べ替えたい場合、引数axisが便利です。
axis=1を指定すると、指定した行に沿って並べ替えます。
df1の行と列を入れ替えて(転置して)、axisを試してみましょう。
df1_T = df1.T
df1_T
出力:
index | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
fruits | Apple | Grape | Cherry | Banana | Cherry |
weight | 100 | 200 | 150 | 50 | 300 |
plice | 100 | 150 | 400 | 100 | 200 |
df1の表と列が入れ替わりました。
df1_T.sort_values('fruits', axis=1)
出力:
index | 0 | 3 | 2 | 4 | 1 |
---|---|---|---|---|---|
fruits | Apple | Banana | Cherry | Cherry | Grape |
weight | 100 | 50 | 150 | 300 | 200 |
plice | 100 | 100 | 400 | 200 | 150 |
行名 ‘fruits’ に沿ってソートされたことが確認できます。
昇順・降順の指定: ascending
並び替えはデフォルトで昇順 (1→9, A→Z)に設定されています。
ascending=Falseとすると降順 (9→1, Z→A)でソートされます。
df1.sort_values('fruits', ascending=False)
出力:
index | fruits | weight | plice |
---|---|---|---|
1 | Grape | 200 | 150 |
2 | Cherry | 150 | 400 |
4 | Cherry | 300 | 200 |
3 | Banana | 50 | 100 |
0 | Apple | 100 | 100 |
もとのDataFrameを変更: inplace
引数inplaceをTrueとするとソートされた結果を元のDataFrameに反映します。
元のDataFrameを変更してしまうと修正したいときに手間なので、使用時は注意しましょう。
欠損値(NaN)のソート条件の指定: na_position
指定した列に空白 (欠損値, NaN)が含まれている場合、デフォルトでは最後にソートされます。
df1の ‘weight’ にNaNを用意して確認してみます。
df1_nan = df1.copy()
df1_nan.iloc[2, 1] = pd.np.nan
df1_nan
出力:
index | fruits | weight | plice |
---|---|---|---|
0 | Apple | 100.0 | 100 |
1 | Grape | 200.0 | 150 |
2 | Cherry | NaN | 400 |
3 | Banana | 50.0 | 100 |
4 | Cherry | 300.0 | 200 |
df1_nan.sort_values('weight')
出力:
index | fruits | weight | plice |
---|---|---|---|
3 | Banana | 50.0 | 100 |
0 | Apple | 100.0 | 100 |
1 | Grape | 200.0 | 150 |
4 | Cherry | 300.0 | 200 |
2 | Cherry | NaN | 400 |
na_position=firstとするとNaNが先頭に並べられます。
df1_nan.sort_values('weight', na_position='first')
出力:
index | fruits | weight | plice |
---|---|---|---|
2 | Cherry | NaN | 400 |
3 | Banana | 50.0 | 100 |
0 | Apple | 100.0 | 100 |
1 | Grape | 200.0 | 150 |
4 | Cherry | 300.0 | 200 |
indexの振り直し: ignore_index
indexはDataFrame作成時に割り振られるため、ソートするとそれに合わせた順番になってしまいます。
ignore_index=Trueと指定することで、インデックスの振り直しが可能です。
df1.sort_values('fruits', ignore_index=True)
出力:
index | fruits | weight | plice |
---|---|---|---|
0 | Apple | 100 | 100 |
1 | Banana | 50 | 100 |
2 | Cherry | 150 | 400 |
3 | Cherry | 300 | 200 |
4 | Grape | 200 | 150 |
pandas.sort_index()の使い方
pandas.sort_indexはインデックスを参照してソートする関数です。
準備
始めにDataFrameを準備します。
indexをバラバラに設定したいため、先ほどと記述方法を変えてDataFrameを作成します。
d = [['Apple', 100, 100], ['Grape', 200, 150], ['Cherry', 150, 400], ['Banana', 50, 100], ['Cherry', 300, 200]]
df2 = pd.DataFrame(
data=d,
index=[3, 5, 1, 4, 2],
columns=['fuits', 'weight', 'plice']
)
df2
出力:
index | fuits | weight | plice |
---|---|---|---|
3 | Apple | 100 | 100 |
5 | Grape | 200 | 150 |
1 | Cherry | 150 | 400 |
4 | Banana | 50 | 100 |
2 | Cherry | 300 | 200 |
基本的な使い方
ソートしたいDataFrameの後ろに.sort_index() を記述するだけで、indexに沿ってデータが並び替えられます。
df2.sort_index()
出力:
index | fuits | weight | plice |
---|---|---|---|
1 | Cherry | 150 | 400 |
2 | Cherry | 300 | 200 |
3 | Apple | 100 | 100 |
4 | Banana | 50 | 100 |
5 | Grape | 200 | 150 |
pandas.sort_indexの引数
.sort_index()の引数を紹介します。.sort_values()と同じものが多いです。
並び替える軸を指定する: axis
引数axisに1を指定することで、列を並べ替えます。
df2.sort_index(axis=1)
出力:
index | fuits | plice | weight |
---|---|---|---|
3 | Apple | 100 | 100 |
5 | Grape | 150 | 200 |
1 | Cherry | 400 | 150 |
4 | Banana | 100 | 50 |
2 | Cherry | 200 | 300 |
ここで注意したいのは、.sort_index()のaxis引数は列自体の並び替えになることです。
上の結果で言うと、列が列名の頭文字に沿ってソートされています。
昇順・降順の指定: ascending
引数ascendingをFalseと記述すると、降順でソートされます。
df2.sort_index(ascending=False)
出力:
index | fuits | weight | plice |
---|---|---|---|
5 | Grape | 200 | 150 |
4 | Banana | 50 | 100 |
3 | Apple | 100 | 100 |
2 | Cherry | 300 | 200 |
1 | Cherry | 150 | 400 |
元のDataFrameを変更: inplace
引数inplaceをTrueとするとソートされた結果を元のDataFrameに反映します。
元のDataFrameを変更してしまうと修正したいときに手間なので、使用時は注意しましょう。
欠損値(NaN)のソートの指定: na_position
NaNが含まれるインデックスをソートするとNaNは最後にソートされます。
df2_nan = pd.DataFrame(
data=d,
index=[3, 5, 1, pd.np.nan, 2],
columns=['fuits', 'weight', 'plice'])
df2_nan
出力:
index | fuits | weight | plice |
---|---|---|---|
3.0 | Apple | 100 | 100 |
5.0 | Grape | 200 | 150 |
1.0 | Cherry | 150 | 400 |
NaN | Banana | 50 | 100 |
2.0 | Cherry | 300 | 200 |
df2_nan.sort_index()
出力:
index | fuits | weight | plice |
---|---|---|---|
1.0 | Cherry | 150 | 400 |
2.0 | Cherry | 300 | 200 |
3.0 | Apple | 100 | 100 |
5.0 | Grape | 200 | 150 |
NaN | Banana | 50 | 100 |
pandas.sort_values()同様、引数np_positionでNaNのソート条件を変更可能です。
df2_nan.sort_index(na_position='first')
出力:
index | fuits | weight | plice |
---|---|---|---|
NaN | Banana | 50 | 100 |
1.0 | Cherry | 150 | 400 |
2.0 | Cherry | 300 | 200 |
3.0 | Apple | 100 | 100 |
5.0 | Grape | 200 | 150 |
indexの振り直し: ignore_index
pandas.sort_indexでもソート後のindexを振り直すignore_indexが使用可能です。
引数ascendingやNaNが含まれるDataFrameで使用するといいでしょう。
df2nan.sort_index(ignore_index=True)
出力:
index | fuits | weight | plice |
---|---|---|---|
0 | Cherry | 150 | 400 |
1 | Cherry | 300 | 200 |
2 | Apple | 100 | 100 |
3 | Grape | 200 | 150 |
4 | Banana | 50 | 100 |
まとめ
今回はデータの順番を並べ替えるpandas.sort_valuesとpandas_sort_indexについて紹介しました。
基本的にはどちらも似たような引数を持っていますが、axisは異なった結果になるので注意が必要です。
この記事を読んでPythonを勉強したいと思った人はこちらの記事もご覧ください。Pythonを独学する方法を紹介しています。
コメント