【Pandas】MultiIndexとは？(pivotメソッドを学ぶ前に知っておくべきこと)no.24

![見出しを追加 (52).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/78ced340-1d03-d079-2b2a-d1f396c4badf.png)
こんにちは、まゆみです。

Pandasの記事をシリーズで書いています。

今回の記事は第24回目になります。

今回の記事では、<font color="Red">『Multiindex』(マルチインデックス)</font>という概念を扱っていこうと思います。

Multiindex とは文字通り、<font color="Red">複数のインデックス</font>という意味です。

この記事を読めば
<ul>
<li>MultiIndexとは？</li>
<li>コラムからインデックスに変更するには</li>
<li>MultiIndexを扱う時のレベルとは？</li>
</ul>

が分かります。


また、Multiindexの概要が十分に理解できたら、次回以降の記事で『pivot』や『pivot_table』についても触れていきます。

今回の記事は、そのウォーミングアップのような位置づけになります。

ではさっそく始めていきますね。

#今回使うデータ
![見出しを追加 (53).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ca67d6a3-4abf-45df-b65a-77f07916ba27.png)

今回は、[data.world](https://data.world/)さんのサイトから[ウェラブル端末に関するデータ](https://data.world/crowdflower/wearable-technology-database/workspace/file?filename=Wearables-DFE.csv)を使っていきます。

read_csv()で読み込むと下記のような感じになります。

![スクリーンショット 2021-03-29 073342.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/09efec17-6f1a-39ba-f9db-11f1b3783488.jpeg)


Body.Location(体のどの部位につけるか)というコラムと、Company...Country(会社がある国)というコラムがあるので、これら２つをインデックスにしていきます。

#set_index()

コラムをインデックスにするメソッドは、<font color="Red">.set_index()</font>があります。

![スクリーンショット 2021-03-29 090700.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/fcede7eb-ef8a-d64a-0b5d-62a6aaff808c.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.set_index.html)

keys には、インデックスにしたいコラム名を引数として渡します。

今回は2つのコラムをインデックスにしたいので、コラム名をリストに入れて、引数として渡します。

```
df.set_index(keys=[ "コラムA", "コラムB" ])
```

そしてこの実行結果をオリジナルのDataFrame に上書きしたいので、パラメーターinplace = True　とします。

また、<font color="Red">新たに作ったインデックスをアルファベット順に並べたい</font>ので、

```
.sort_index()
```

でインデックスをアルファベット順(インデックスが数字の場合は小さい順)に並べます

実行結果は下記のようになりました。

![スクリーンショット 2021-03-29 0922411.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a68ec506-f8db-bb77-13a0-0e3c4e5ef63b.jpeg)

リスト型にして引数として渡したコラム名は<font color="Red">一番最初に書かれたものから順番に一番外側のインデックスから配置</font>されます。
言葉での説明はややこしいので下のイラストをご覧くださいませ。<(_ _)>

![set_index(keys=[]).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/cd2a5fc1-1b23-597a-a68e-2b20695b7173.png)

リストの最初のアイテムから順番に、外側からインデックスを埋めていきます。

##新たにインデックスにしたインデックスのデータ型は？

![スクリーンショット 2021-03-29 094459.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/eacbaeb5-a43d-adfc-6866-cc6645d12cc6.jpeg)
上のスクショから分かるように、新たなインデックスのデータ型はタプルです。

また、インデックスの名前は、2つのコラム名が一緒になったリスト型になっています

![スクリーンショット 2021-03-29 094934.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1929b93a-0173-d1be-1ee2-a7284dda7a0d.jpeg)

#インデックスのラベルを変更したい時(レベルとは何か？)
インデックスのラベル名を変更したい時に使うのが.set_names()になります。

![スクリーンショット 2021-03-29 100602.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/68154028-2a76-c746-7fe2-06b0ead25813.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Index.set_names.html#pandas-index-set-names)

ただ、Multiindex になっている時には、注意が必要です。

どちらのインデックス名を変更するのか指定しないといけないからです。

ドキュメントに引数としてレベルを渡すと書いていますが、この『レベル』というものが、Multiindex の、どのインデックスを指定するかに使われるものです。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/81a4d817-ee1e-67e2-0a8a-bd3e436cde2c.png)

では、2つのインデックスのうち、『Company...Country』を日本語の『国名』に変えてみます。

```
df.index.set_names( names="変更後のラベル", level=multiindexのレベル, inplace=上書きするか？)
```
実行結果は下記のようになります。

![スクリーンショット 2021-03-29 102317.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/b0a6ddad-f7e8-5986-7132-b6e3de1edf67.jpeg)

この『レベル』の定義は、後々、Pandasのドキュメントを読む時にも必要になるので、是非覚えておいてくださいね

#まとめ

今回の記事では、実際にデータを集計する前に必要となる作業について書かせていただきました。

データを集計する前のデータの処理が終われば、実際にデータを集計する事ができます。(エクセルのピボットテーブルを使った事がある方なら、Pandasでも同じことができるメソッドがあります)

少し退屈な記事が続くと思いますが、どうぞよろしくお願いします！