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

## 【はじめに】

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

### 本記事の内容

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

## 【pandasのインポート】

```Python
import pandas as pd
```

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

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

```Python
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」としてアップロードしてあるので、下記コマンドでダウンロードすれば簡単に準備できます。

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

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

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

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

### DataFrameの１つのカラムのデータを並べ替える

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

```Python
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     | 

```Python
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`（昇順）です。

```Python
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の２つ以上のカラムのデータを並べ替える

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

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

```Python
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     | 

```Python
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`をリストで指定します。

```Python
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のインデックスを降順に並べ替えてみます。

```Python
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のカラムを降順に並べ替えてみます。

```Python
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`にリストで並べ替えたカラムを指定します。

```Python
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     | 

```Python
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は下記コマンドでダウンロードできるので、自由に使って是非練習してみてください。

```Shell
$ curl https://raw.githubusercontent.com/nakachan-ing/python-references/master/Pandas/pandasでデータを並び替える.ipynb -O
```

https://github.com/nakachan-ing/python-references/tree/master/Pandas