【Pandas】行と列のデータを並び替える方法 | sort_values/sort_index/reindex

Python

【はじめに】

Pythonライブラリの「Pandas」の中で、データを並び替える方法はいくつかあります。
今回はその中でも「sort_values」、「sort_index」、「reindex」について紹介していきます。

本記事の内容

  • pandasのインポート
  • csvファイルの読み込み
  • データを並び替える | sort_values
  • インデックスを並び替える | sort_index
  • カラムを並び替える | sort_index(axis=1)
  • カラムを任意の順番に並び替える | reindex

【pandasのインポート】

import pandas as pd

【csvファイルの読み込み】

「1920年から2015年までの全国の人口推移のデータ」を使用します。

df = pd.read_csv('data.csv', encoding='shift-jis')
df
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
0 1 北海道 大正 9 1920 2359183 1244322 1114861
1 2 青森県 大正 9 1920 756454 381293 375161
2 3 岩手県 大正 9 1920 845540 421069 424471
3 4 宮城県 大正 9 1920 961768 485309 476459
4 5 秋田県 大正 9 1920 898537 453682 444855
934 43 熊本県 平成 27 2015 1786170 841046 945124
935 44 大分県 平成 27 2015 1166338 551932 614406
936 45 宮崎県 平成 27 2015 1104069 519242 584827
937 46 鹿児島県 平成 27 2015 1648177 773061 875116
938 47 沖縄県 平成 27 2015 1433566 704619 728947
939 rows × 8 columns

私のGitHubに「data.csv」としてアップロードしてあるので、下記コマンドでダウンロードすれば簡単に準備できます。

curl https://raw.githubusercontent.com/nakachan-ing/python-references/master/Pandas/data.csv -O

【データを並び替える | sort_values】

sort_valuesメソッドを使用するとデフォルトで「昇順」に並び替えることができます。

引数byに並び替えしたいカラムを指定します。

DataFrameの1つのカラムのデータを並び替える

平成27年のデータを抽出し、人口(総数)の少ない順(昇順)に並び替えてみます。

df_h27 = df[(df['元号'] == '平成') & (df['和暦(年)'] == 27.0)]
df_h27.head(10)
# df[df['西暦(年)'] == 2015.0]でも同じ結果
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
892 1 北海道 平成 27 2015 5381733 2537089 2844644
893 2 青森県 平成 27 2015 1308265 614694 693571
894 3 岩手県 平成 27 2015 1279594 615584 664010
895 4 宮城県 平成 27 2015 2333899 1140167 1193732
896 5 秋田県 平成 27 2015 1023119 480336 542783
897 6 山形県 平成 27 2015 1123891 540226 583665
898 7 福島県 平成 27 2015 1914039 945660 968379
899 8 茨城県 平成 27 2015 2916976 1453594 1463382
900 9 栃木県 平成 27 2015 1974255 981626 992629
901 10 群馬県 平成 27 2015 1973115 973283 999832
df_h27.sort_values(by='人口(総数)', ascending=True).head(10)
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
922 31 鳥取県 平成 27 2015 573441 273705 299736
923 32 島根県 平成 27 2015 694352 333112 361240
930 39 高知県 平成 27 2015 728276 342672 385604
927 36 徳島県 平成 27 2015 755733 359790 395943
909 18 福井県 平成 27 2015 786740 381474 405266
932 41 佐賀県 平成 27 2015 832832 393073 439759
910 19 山梨県 平成 27 2015 834930 408327 426603
921 30 和歌山県 平成 27 2015 963579 453216 510363
928 37 香川県 平成 27 2015 976263 472308 503955
896 5 秋田県 平成 27 2015 1023119 480336 542783

ポイント

  • データを降順に並び替える場合は、引数byFalseを指定します。
  • 引数byのデフォルトはTrue(昇順)です。
df_h27.sort_values(by='人口(総数)', ascending=False).head(10)
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
904 13 東京都 平成 27 2015 13515271 6666690 6848581
905 14 神奈川県 平成 27 2015 9126214 4558978 4567236
918 27 大阪府 平成 27 2015 8839469 4256049 4583420
914 23 愛知県 平成 27 2015 7483128 3740844 3742284
902 11 埼玉県 平成 27 2015 7266534 3628418 3638116
903 12 千葉県 平成 27 2015 6222666 3095860 3126806
919 28 兵庫県 平成 27 2015 5534800 2641561 2893239
892 1 北海道 平成 27 2015 5381733 2537089 2844644
931 40 福岡県 平成 27 2015 5101556 2410418 2691138
913 22 静岡県 平成 27 2015 3700305 1820993 1879312

DataFrameの2つ以上のカラムのデータを並び替える

2つ以上のカラムを並び替えたい場合は、引数byにリストで指定します。

年号が「大正」のデータを抽出し、「都道府県」と「人口(総数)」をリストで指定して並び替えて見ます。

df_taisho = df[df['元号'] == '大正']
df_taisho.head(10)
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
0 1 北海道 大正 9 1920 2359183 1244322 1114861
1 2 青森県 大正 9 1920 756454 381293 375161
2 3 岩手県 大正 9 1920 845540 421069 424471
3 4 宮城県 大正 9 1920 961768 485309 476459
4 5 秋田県 大正 9 1920 898537 453682 444855
5 6 山形県 大正 9 1920 968925 478328 490597
6 7 福島県 大正 9 1920 1362750 673525 689225
7 8 茨城県 大正 9 1920 1350400 662128 688272
8 9 栃木県 大正 9 1920 1046479 514255 532224
9 10 群馬県 大正 9 1920 1052610 514106 538504
df_taisho.sort_values(by=['都道府県名', '人口(総数)'])
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
0 1 北海道 大正 9 1920 2359183 1244322 1114861
1 2 青森県 大正 9 1920 756454 381293 375161
2 3 岩手県 大正 9 1920 845540 421069 424471
3 4 宮城県 大正 9 1920 961768 485309 476459
4 5 秋田県 大正 9 1920 898537 453682 444855
5 6 山形県 大正 9 1920 968925 478328 490597
6 7 福島県 大正 9 1920 1362750 673525 689225
7 8 茨城県 大正 9 1920 1350400 662128 688272
8 9 栃木県 大正 9 1920 1046479 514255 532224
9 10 群馬県 大正 9 1920 1052610 514106 538504
94 rows × 8 columns

ポイント

  • それぞれのカラムに対して、昇順と降順を別々に指定することができます。
  • 引数ascendingTrueFalseをリストで指定します。
df_taisho.sort_values(by=['都道府県名', '人口(総数)'], ascending=[True, False])
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
70 24 三重県 大正 14 1925 1107692 544752 562940
23 24 三重県 大正 9 1920 1069270 525957 543313
72 26 京都府 大正 14 1925 1406382 717464 688918
25 26 京都府 大正 9 1920 1287147 650780 636367
87 41 佐賀県 大正 14 1925 684831 336223 348608
38 39 高知県 大正 9 1920 670895 332087 338808
77 31 鳥取県 大正 14 1925 472230 230580 241650
30 31 鳥取県 大正 9 1920 454675 222802 231873
92 46 鹿児島県 大正 14 1925 1472193 713702 758491
45 46 鹿児島県 大正 9 1920 1415582 682243 733339
94 rows × 8 columns

【インデックスを並び替える | sort_index】

sort_indexメソッドを使用すると、インデックス名を並び替えることができます。

引数ascendingのデフォルトはTrue(昇順)です。

dfのインデックスを降順に並び替えてみます。

df.sort_index(ascending=False)
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
938 47 沖縄県 平成 27 2015 1433566 704619 728947
937 46 鹿児島県 平成 27 2015 1648177 773061 875116
936 45 宮崎県 平成 27 2015 1104069 519242 584827
935 44 大分県 平成 27 2015 1166338 551932 614406
934 43 熊本県 平成 27 2015 1786170 841046 945124
4 5 秋田県 大正 9 1920 898537 453682 444855
3 4 宮城県 大正 9 1920 961768 485309 476459
2 3 岩手県 大正 9 1920 845540 421069 424471
1 2 青森県 大正 9 1920 756454 381293 375161
0 1 北海道 大正 9 1920 2359183 1244322 1114861
939 rows × 8 columns

【カラムを並び替える | sort_index(axis=1)】

sort_indexメソッドの引数axisに「1」を指定すると、カラムを並び替えることができます。

引数ascendingFalseを指定すると降順になります。

dfのカラムを降順に並び替えてみます。

df_sort_index = df.sort_index(axis=1, ascending=False)
df_sort_index
都道府県名 都道府県コード 西暦(年) 和暦(年) 元号 人口(総数) 人口(男) 人口(女)
0 北海道 1 1920 9 大正 2359183 1244322 1114861
1 青森県 2 1920 9 大正 756454 381293 375161
2 岩手県 3 1920 9 大正 845540 421069 424471
3 宮城県 4 1920 9 大正 961768 485309 476459
4 秋田県 5 1920 9 大正 898537 453682 444855
934 熊本県 43 2015 27 平成 1786170 841046 945124
935 大分県 44 2015 27 平成 1166338 551932 614406
936 宮崎県 45 2015 27 平成 1104069 519242 584827
937 鹿児島県 46 2015 27 平成 1648177 773061 875116
938 沖縄県 47 2015 27 平成 1433566 704619 728947
939 rows × 8 columns

降順にするとデータの構造が分かりにくくなりますね。

【カラムを任意の順番に並び替える | reindex】

カラムを任意の順番に並び替えをする場合は、DataFrame.reindexメソッドの引数indexにリストで並び替えたカラムを指定します。

df_sort_index.head()
都道府県名 都道府県コード 西暦(年) 和暦(年) 元号 人口(総数) 人口(男) 人口(女)
0 北海道 1 1920 9 大正 2359183 1244322 1114861
1 青森県 2 1920 9 大正 756454 381293 375161
2 岩手県 3 1920 9 大正 845540 421069 424471
3 宮城県 4 1920 9 大正 961768 485309 476459
4 秋田県 5 1920 9 大正 898537 453682 444855
df_sort_index.reindex(columns = ['都道府県コード', '都道府県名', '元号', '和暦(年)', '西暦(年)', '人口(総数)', '人口(男)', '人口(女)'])
都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女)
0 1 北海道 大正 9 1920 2359183 1244322 1114861
1 2 青森県 大正 9 1920 756454 381293 375161
2 3 岩手県 大正 9 1920 845540 421069 424471
3 4 宮城県 大正 9 1920 961768 485309 476459
4 5 秋田県 大正 9 1920 898537 453682 444855
934 43 熊本県 平成 27 2015 1786170 841046 945124
935 44 大分県 平成 27 2015 1166338 551932 614406
936 45 宮崎県 平成 27 2015 1104069 519242 584827
937 46 鹿児島県 平成 27 2015 1648177 773061 875116
938 47 沖縄県 平成 27 2015 1433566 704619 728947
939 rows × 8 columns

ポイント

インデックスを任意の順番に並び替える場合は、引数indexに並び替えたインデックスをリストで指定します。

【おわりに】

今回は「sort_values」、「sort_index」、「reindex」について紹介しました。

Pandasでデータを結合後に並び替えを行うことが多いので、ぜひこの機会に覚えてしまいましょう。

使用したCSVファイルやJupyter NotebookはGitHubに公開しています。
Jupyter Notebookは下記コマンドでダウンロードできるので、自由に使って是非練習してみてください。

$ curl https://raw.githubusercontent.com/nakachan-ing/python-references/master/Pandas/pandasでデータを並び替える.ipynb -O
python-references/Pandas at master · nakachan-ing/python-references
Contribute to nakachan-ing/python-references development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました