データの順番を並び替えるpandas.sort関数の使い方

データの順番を並べ替えるpandas.sort関数の使い方

データの順番を並び替えたいことってありますよね。

pandasには順番を並び替える関数として、pandas.sort_valuse()とpandas.sort_index()の2つがあります。

本記事ではソート関数の説明と使い方について、例を用いながらわかりやすく解説していきます。

目次

pandas.sort関数について

pandas.sort関数について

pandas.sott()は昔のバージョンにあった関数で、新しいバージョンでは使用できません。

代わりにpandas.sort_values()とpandas.sort_index()が用意されています。

値で並び替えたい場合はpandas.sort_values()、インデックスで並び替えたい時はpandas.sort_index()を使います。

本記事のコードはグーグルコラボラトリーで実行・確認しています。

pandas.sort_values()の使い方

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

出力:

indexfruitsweightplice
0Apple100100
1Grape200150
2Cherry150400
3Banana50100
4Cherry300200
df1

基本的な使い方

pandas.sort_valuesは指定した軸に沿って並べ替えます。

ソートしたい列名を指定することで使用可能です。df1を果物の名前で並べ替えてみましょう。

df1.sort_values('fruits')

出力:

indexfruitsweightplice
0Apple100100
3Banana50100
2Cherry150400
4Cherry300200
1Grape200150
pandas.sort_values

‘fruits’列の昇順(A→Z)に沿ってデータが並び変わりました。

pandas.sort_valuesは複数の列を指定してソートすることも可能です。果物名と価格の2つを指定してみましょう。

複数の列名でソートしたい時は、リストで指定してください。

df1.sort_values(['fruits', 'plice'])

出力:

indexfruitsweightplice
0Apple100100
3Banana50100
4Cherry300200
2Cherry150400
1Grape200150
pandas.sort_values2

‘fruits’ のソート条件が最優先されて、2つデータがあるCherryの順番が ‘plice’の値によって並び替えられました。

指定する列名の順番を変えたらどうなるでしょう?

df1.sort_values(['plice', 'fruits'])

出力:

indexfruitsweightplice
0Apple100100
3Banana50100
1Grape200150
4Cherry300200
2Cherry150400
sort_values3

‘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

出力:

index01234
fruitsAppleGrapeCherryBananaCherry
weight10020015050300
plice100150400100200
df1_T

df1の表と列が入れ替わりました。

df1_T.sort_values('fruits', axis=1)

出力:

index03241
fruitsAppleBananaCherryCherryGrape
weight10050150300200
plice100100400200150
values-axis

行名 ‘fruits’ に沿ってソートされたことが確認できます。

昇順・降順の指定: ascending

並び替えはデフォルトで昇順 (1→9, A→Z)に設定されています。

ascending=Falseとすると降順 (9→1, Z→A)でソートされます。

df1.sort_values('fruits', ascending=False)

出力:

indexfruitsweightplice
1Grape200150
2Cherry150400
4Cherry300200
3Banana50100
0Apple100100
values-ascending

もとの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 

出力:

indexfruitsweightplice
0Apple100.0100
1Grape200.0150
2CherryNaN400
3Banana50.0100
4Cherry300.0200
df1_nan
df1_nan.sort_values('weight')

出力:

indexfruitsweightplice
3Banana50.0100
0Apple100.0100
1Grape200.0150
4Cherry300.0200
2CherryNaN400
df1_nan.sort_values

na_position=firstとするとNaNが先頭に並べられます。

df1_nan.sort_values('weight', na_position='first')

出力:

indexfruitsweightplice
2CherryNaN400
3Banana50.0100
0Apple100.0100
1Grape200.0150
4Cherry300.0200
values-na_position

indexの振り直し: ignore_index

indexはDataFrame作成時に割り振られるため、ソートするとそれに合わせた順番になってしまいます。

ignore_index=Trueと指定することで、インデックスの振り直しが可能です。

df1.sort_values('fruits', ignore_index=True)

出力:

indexfruitsweightplice
0Apple100100
1Banana50100
2Cherry150400
3Cherry300200
4Grape200150
values-ignore_index

pandas.sort_index()の使い方

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

出力:

indexfuitsweightplice
3Apple100100
5Grape200150
1Cherry150400
4Banana50100
2Cherry300200
df2

基本的な使い方

ソートしたいDataFrameの後ろに.sort_index() を記述するだけで、indexに沿ってデータが並び替えられます。

df2.sort_index()

出力:

indexfuitsweightplice
1Cherry150400
2Cherry300200
3Apple100100
4Banana50100
5Grape200150
sort_index

pandas.sort_indexの引数

.sort_index()の引数を紹介します。.sort_values()と同じものが多いです。

並び替える軸を指定する: axis

引数axisに1を指定することで、列を並べ替えます。

df2.sort_index(axis=1)

出力:

indexfuitspliceweight
3Apple100100
5Grape150200
1Cherry400150
4Banana10050
2Cherry200300
index-axis

ここで注意したいのは、.sort_index()のaxis引数は列自体の並び替えになることです。

上の結果で言うと、列が列名の頭文字に沿ってソートされています。

引数axisの対象の違い

昇順・降順の指定: ascending

引数ascendingをFalseと記述すると、降順でソートされます。

df2.sort_index(ascending=False)

出力:

indexfuitsweightplice
5Grape200150
4Banana50100
3Apple100100
2Cherry300200
1Cherry150400
index-ascending

元の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

出力:

indexfuitsweightplice
3.0Apple100100
5.0Grape200150
1.0Cherry150400
NaNBanana50100
2.0Cherry300200
df2_nan
df2_nan.sort_index()

出力:

indexfuitsweightplice
1.0Cherry150400
2.0Cherry300200
3.0Apple100100
5.0Grape200150
NaNBanana50100
df2_nan.sort_index

pandas.sort_values()同様、引数np_positionでNaNのソート条件を変更可能です。

df2_nan.sort_index(na_position='first')

出力:

indexfuitsweightplice
NaNBanana50100
1.0Cherry150400
2.0Cherry300200
3.0Apple100100
5.0Grape200150
index-na_position

indexの振り直し: ignore_index

pandas.sort_indexでもソート後のindexを振り直すignore_indexが使用可能です。

引数ascendingやNaNが含まれるDataFrameで使用するといいでしょう。

df2nan.sort_index(ignore_index=True)

出力:

indexfuitsweightplice
0Cherry150400
1Cherry300200
2Apple100100
3Grape200150
4Banana50100
index.ignore_index

まとめ

今回はデータの順番を並べ替えるpandas.sort_valuesとpandas_sort_indexについて紹介しました。

基本的にはどちらも似たような引数を持っていますが、axisは異なった結果になるので注意が必要です。

この記事を読んでPythonを勉強したいと思った人はこちらの記事もご覧ください。Pythonを独学する方法を紹介しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次