18. Pandasでデータ分析

図解!Pandas DataFrameのソート徹底解説(sort_values・index)

更新日:

Pythonのデータ分析用ライブラリPandasのDataFrame、Seriesに表示されているデータは、様々な方法でソート(並び替え)することができます。
 
主なソート方法は、

  • 指定した列の値によるソート
  • インデックスによるソート

また昇順、降順のいずれも指定することができます。

 
Seriesもソートについては一部制限があるものの、ほぼDataFrameと同じです。よって、ここではDataFrameで例を確認していきます。

 
例として、あるストアの売上情報(一部)を格納するDataframe df1を元に、様々なソートの方法を見ていきましょう。

PythonのPandasのDataFrame/Seriesにおける列(カラム)の値(values)によるソート(並び替え)(sort_values)

本記事の実行結果は、Jupyter Notebook(ジュピター・ノートブック)で確認しております。

 
従いまして、最終行の「df1」を実行すると、DataFrameの内容が表示されています。別の環境で実行される場合は、必要に応じて「df1」を「print(df1)」に置き換えてください。

 
またJupyter Notebookの詳しい説明は「図解!Jupyter Notebookを徹底解説!」を参照ください。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

Pandas DataFrameにおける指定した列の値によるソート(sort_values)

指定した列の値によるソートは、sort_valuesを用います。引数byで値に基づくソートを行う対象の列を指定します。

DataFrame.sort_values(by=列名, その他任意の引数)

 
引数ascendingにTrueを指定すると昇順、Falseを指定すると降順にソートされます。何も指定しなければ、Trueの昇順になります。

 
主な引数は、

引数必須/任意説明
by必須ソートする列名を指定する。
ascending任意byで指定した列のソートの昇順、降順を指定する。
リストで複数の列を指定することも可能。
True: 昇順
False: 降順
※何も指定しなければ、True(昇順)
inplace任意ソート結果を保存する/しないを指定する。
True:実行結果がDataFrameに保存される。
False: DataFrameには実行結果が保存されない。
※何も指定しなければ、False
axis任意ソートする軸(行 or 列)を指定する。
0: 指定した列の値による行のソート
1: 指定した行の値による列のソート
※何も指定しなければ、0(行のソート)
またSeriesは0(行のソート)のみ選択可能
kind任意ソートのアルゴリズムを指定する。
"quicksort": クイックソート
"mergesort": マージソート
"heapsort": ヒープソート
※何も指定しなければ、"quicksort"
na_position任意値がNaN(欠損値)の場合のソート順を指定する。
"first": 値がNaNの場合は最初に表示する。
"last": 値がNaNの場合は最後に表示する。
※何も指定しなければ、"last"

 
 

引数by: ソートする列名を文字列(単一キー)・リスト(複数キー)で指定

sort_valuesの引数byは、ソートする列名を文字列やリストで指定することができます。

  • 1つの列をキーにソートする場合、列名を文字列で指定します。
  • 複数の列をキーにソートする場合、複数の列名を格納したリストで指定します。

 
DataFrame df1の列"Amount (JPY)"の値を元に、昇順にソートします。引数byには列名"Amount (JPY)"を渡します。また"by="は省略することもできます。

値(values)を元にソートするsort_values関数の引数byを使って、ソート(並び替え)する列名を文字列(単一キー)・リスト(複数キー)で指定

df1の列"Amount (JPY)"の値について、上から37000, 85000, 130000, 260000と昇順に並んでいることがわかります。
引数ascendingに何も指定しなければ、昇順になります。

 
 
複数の列を指定してソートする場合、引数byにはリストを渡します。
 
2つの列”Product ID”、"Amount (JPY)"を元にソートしてみましょう。

値(values)を元にソートするsort_values関数の引数byを使って、ソート(並び替え)する列名を文字列(単一キー)・リスト(複数キー)で指定

こちらも引数ascendingに何も指定しなければ、2つの列ともに昇順になります。
 

 
 

引数ascending: 昇順・降順の指定

sort_valuesの引数ascendingでは、ソートする際の昇順・降順を指定することができます。

  • 1つの列をキーにソートする場合、True(昇順)、False(降順)で指定します。
  • 複数の列をキーにソートする場合、列毎にTrue、Falseを格納したリストで指定します。

また何も指定しなければTrue(昇順)になります。

 
DataFrame df1の列"Amount (JPY)"の値を元に、降順にソートします。この場合、引数ascendingには、Falseを指定します。

Python Pandas DataFrame/Seriesにおける列(カラム)の値によるソート(並び替え)(sort_values関数)

df1の列"Amount (JPY)"の値について、今度は上から260000, 130000, 85000, 37000と降順に並びました。

 
次にDataFrame df1の列"Product ID"の値で昇順に、"Amount (JPY)"の値で降順にソートします。この場合、引数ascendingには、リストを渡します。

Python Pandas DataFrame/Seriesにおける列(カラム)の値(values)によるソート(並び替え)(sort_values関数)

df1の列"Product ID"の値は昇順に、"Amount (JPY)"の値は降順になりました。

 
 

引数inplace: ソート結果の保存有無の指定

sort_valuesの引数inplaceでは、ソートした結果をDataFrameに保存する/しないを指定することができます。

  • True:実行結果がDataFrameに保存される。
  • False: DataFrameには実行結果が保存されない。

※何も指定しなければ、Falseになります。

 
例えば、DataFrame df1の列"Amount (JPY)"の値を元に、昇順にソートします。

sort_values関数の引数byでソート(並び替え)する列名を文字列(単一キー)・リスト(複数キー)で指定

inplaceには何も指定されず、DataFrameにはソートの実行結果が保存されません。

 
再度、DataFrameの内容を表示してみましょう。

Python Pandas DataFrame/Seriesにおける列(カラム)の値(values)によるソート(並び替え)(sort_values関数)

ソートが元に戻っています。

 
この指定したソートをDataFrameに保存するには、sort_valuesの引数inplaceにTrueを渡します。そしてdf1の内容を表示すると、

値(values)を元にソートするsort_values関数の引数byを使って、ソート(並び替え)する列名を文字列(単一キー)・リスト(複数キー)で指定

DataFrameにソート結果が保存されました。

 
 

引数kind: ソートのアルゴリズムを指定

sort_valuesの引数kindでは、ソートのアルゴリズムを指定します。

  • "quicksort": クイックソート
  • "mergesort": マージソート
  • "heapsort": ヒープソート

※何も指定しなければ、"quicksort"になります。
基本的には、"quicksort"で問題ありません。

 
 

引数na_position: NaN(欠損値)のソート順の指定

値がNaN(欠損値)の場合のソート順を指定します。

  • "first": 値がNaNの場合は最初に表示する。
  • "last": 値がNaNの場合は最後に表示する。

※何も指定しなければ、"last"になります。

 
ソートに指定した列がNaN(欠損値)を含む場合があります。
 
ここでは次のようなDataFrame df2を使います。

値(values)を元にソートするsort_values関数の引数na_positionを使って、NaN(欠損値)のソート(並び替え)順の指定

列"Qty"にNaNを含んでいます。

 
列"Qty"でソートしてみます。ソートする際にna_positionに何も指定しないと"last"を指定したことになります。

値(values)を元にソートするsort_values関数の引数na_positionを使って、NaN(欠損値)のソート(並び替え)順の指定

NaNの行は最後に表示されます。

 
今度は、na_positionに"first"を指定します。

値(values)を元にソートするsort_values関数の引数na_positionを使って、NaN(欠損値)のソート(並び替え)順の指定

NaNの行は最初に表示されています。

 
このようにして、引数na_positionでは、NaNを最初に表示するか、最後に表示するかを指定することができます。

 
 

上位10位 (Top 10)などの抽出方法

引数の解説に続いて、sort_valuesでの上位10位などのデータの抽出方法を確認していきます。

 
ここでは次のような15件の売上データを含んだDataFrame df3を使います。

Python Pandasの値(values)を元にソートするsort_values関数を使って、上位10位 (Top 10)などを抽出する方法

列“Amount (JPY)”に金額のデータがあり、これを元に上位10のデータを抽出してみましょう。

 
最初のn件のデータを取得する場合、以下のheadを使います。

head(n)

nには件数を指定します。何も指定しなければ5になります。

 
先ほどのdf3をsort_valuesで列”Amount (JPY)”の降順、つまり金額の高い順に並べ替えて、headで最初の10件を取得します。

Python Pandasの値(values)を元にソートするsort_values関数を使って、上位10位 (Top 10)などを抽出する方法

このようにして上位10位のデータを抽出することができました。

 

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

Pandas DataFrameにおけるインデックスによるソート(sort_index)

インデックスによるソートは、sort_indexを利用します。

DataFrame.sort_index(任意の引数)

 
引数ascendingにTrueを指定すると昇順、Falseを指定すると降順にソートされます。何も指定しなければ、Trueの昇順になります。

 
主な引数は、

引数必須/任意説明
ascending任意byで指定した列のソートの昇順、降順を指定する。
リストで複数の列を指定することも可能。
True: 昇順
False: 降順
※何も指定しなければ、True(昇順)
inplace任意ソート結果を保存する/しないを指定する。
True:実行結果がDataFrameに保存される。
False: DataFrameには実行結果が保存されない。
※何も指定しなければ、False
kind任意ソートのアルゴリズムを指定する。
"quicksort": クイックソート
"mergesort": マージソート
"heapsort": ヒープソート
※何も指定しなければ、"quicksort"
level任意階層型インデックスにおける複数のインデックスのソート順を指定する。
インデックスの番号、もしくはインデックスの列名で指定
※何も指定しなければ、インデックスの順番
axis任意ソートする軸(行 or 列)を指定する。
0: 指定した列の値による行のソート
1: 指定した行の値による列のソート
※何も指定しなければ、0(行のソート)
またSeriesは0(行のソート)のみ選択可能

 
sort_valuesに使った例を元にして、今度はset_indexで列"Product ID"にインデックスを設定します。set_indexの詳しい説明は「Pandas DataFrameへのインデックスの指定」を参照ください。

Python Pandas DataFrame/Seriesにおけるインデックスによるソート(並び替え)(sort_index関数)

列"Product ID"にインデックスが設定されています。

 
 

引数ascending: 昇順・降順の指定

sort_indexの引数ascendingでは、ソートする際の昇順・降順を指定することができます。
True(昇順)、False(降順)で指定し、何も指定しなければTrue(昇順)になります。

 
sort_indexを実行します。引数に何も渡さなければ、ascending=True(昇順)になります。

Python Pandas DataFrame/Seriesにおけるインデックスによるソート(並び替え)(sort_index関数)

インデックス"Product ID"の昇順に並び替えられました。

 
今度は、ascendingにFalse(降順)を指定します。

Python Pandas DataFrame/Seriesにおけるインデックスによるソート(並び替え)(sort_index関数)

インデックス"Product ID"について、上から"P003"、"P002"、"P001"というように降順でソートされていることがわかります。

 
 

引数axis: インデックス、列名(カラム名)でのソートの指定

sort_indexの引数axisでは、ソートする軸(インデックス or 列)を指定します。

  • 0: インデックスによるソート
  • 1: 列名によるソート

※何も指定しなければ、0になります。

 
今までの例はすべて何も指定しなかったので、インデックスでソートしていました。滅多に使うことは無いかも知れませんが、参考までにaxisに1を指定して、列名(カラム名)でのソートの例も見ていきましょう。

 
df1を列名で降順にソートします。

Python Pandas DataFrame/Seriesにおけるインデックスによるソート(並び替え)(sort_index関数)

列名について、左から”Qty”、”Product Name”、”Amount (JPY)”というように降順でソートされていることがわかります。

 
 

引数level: 階層型インデックスでの複数インデックスのソート順の指定

階層型インデックスにおける複数のインデックスのソート順を指定します。インデックスの番号、もしくはインデックスの列名で指定します。
※何も指定しなければ、インデックスの順番になります。

 
今までのインデックスのソートの例では、1つしかインデックスがありませんでした。しかし、PandasのDataFrameには複数のインデックスをもつ、階層型インデックスがあります。
 
ここでは階層型インデックスにおけるソートの指定方法を確認していきます。階層型インデックスの詳しい説明は「Pandas DataFrameの抽出(階層型インデックス(MultiIndex))」を参照ください。

 
例として、次のような売上伝票の情報を取り上げます。列"Sales_No", "Sales_Item_No"にインデックスを設定します。

Python Pandasのsort_index関数の引数levelによる階層型インデックス(multiindex)での複数インデックスのソート順の指定

列"Sales_No", "Sales_Item_No"にインデックスが設定され、このインデックスの順番でデータは並んでいます。

 
これを列"Sales_Item_No"の昇順に並び替えてみましょう。sort_indexの引数levelに"Sales_Item_No"を渡します。

Python Pandasのsort_index関数の引数levelによる階層型インデックス(multiindex)での複数インデックスのソート順の指定

列"Sales_item_No"の昇順でソートされました。

 
このようにしてsort_indexの引数levelでは、複数のインデックスからソートするレベルのインデックスを選択することができます。

 

 
 
関連記事です。
Pandasの中心となるDataFrame(データフレーム)については、次の記事で詳しく解説しております。

 






まとめ記事

1

Python3におけるWEBスクレイピングのやり方について初心者向けに解説した記事です。   Requests、Beautiful Soup、Selenium、Pandas、newspape ...

2

Pythonの基本的なトピックについて、チュートリアル形式で初心者向けに解説した記事です。プログラミング未経験者や初心者でもわかりやすいよう、丁寧に解説しています。   Pythonでデータ ...

3

Pandas(パンダス)とは、データを効率的に扱うために開発されたPythonのライブラリの1つで、データの取り込みや加工・集計、分析処理に利用します。   Pandasには2つの主要なデー ...

4

データ分析、機械学習、ディープラーニングにはグラフの描画による可視化は不可欠です。データは、加工前の状態ではただの数字の羅列でしかなく、一目で必要な情報が伝わるものではありません。それを集計しグラフに ...

5

NumPy(ナンパイ)は、数値計算を効率的に行うための拡張ライブラリです。ベクトルや行列などを効率的に数値計算するための数学関数ライブラリを提供します。NumPyを使うことにより、数値計算をより早く、 ...

-18. Pandasでデータ分析

Copyright© AI-interのPython3入門 , 2020 All Rights Reserved.