【はじめに】
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 |
ポイント
- データを降順に並べ替える場合は、引数
by
にFalse
を指定します。 - 引数
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 |
ポイント
- それぞれのカラムに対して、昇順と降順を別々に指定することができます。
- 引数
ascending
にTrue
とFalse
をリストで指定します。
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」を指定すると、カラムを並べ替えることができます。
引数ascending
にFalse
を指定すると降順になります。
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