LoginSignup
24
25

More than 3 years have passed since last update.

Pandasのマルチインデックスについて

Last updated at Posted at 2020-12-10

はじめに

はんなりPythonアドベントカレンダーの11日目の記事です。
私自身Pandasは本当に初心者なので、以前から気になっていたマルチインデックスについて簡単ですがまとめました。

※本記事では原則下記コードは省略しますが、記述されている前提で進めます。

import pandas as pd

そもそもマルチインデックスとは

行ラベル、列ラベルを階層的に持つことができる仕組みです。
文字での説明がややこしいので、実際に例を見てみましょう。

Snag_907daffc.png

上の図の場合、列ラベルが2層になっています。1列目にはnameとtypeAというラベルが付与されており、2列目にはtimeとtypeAというラベルが付与されています。

マルチインデックスの扱い(列ラベルがマルチの場合)

では、実際にデータを取得する場合を見てみましょう。

Snag_908033e8.png

上の例では、nameとtimeのみの列を抜き出しています。
ちなみに、普通のインデックスの場合も同じ方法で列を抜き出すことができます。(下図参照)

Snag_9081da73.png

つまり、外側のラベルについては、通常の列ラベルと同じ方法で参照できる、ということです。

では、次に内側のラベルで絞り込みを実施してみましょう。
その際は、IndexSliceを使います。

Snag_908e8b5a.png

上図では、typeAで絞り込んだ結果です。typeAにはnameとtimeが含まれるので、typeAで絞るだけで、2列のデータを取得することができます。
マルチインデックスを利用すると、グループ化できるので、一つのラベルで複数の列を絞り込むことが可能になります。

ちなみに、もしnameとtypeAの両方を選択する場合は以下になります(本当はこんなことはしませんが)

Snag_909161bb.png

IndexSliceの記述では、外側のラベルから順番に記述します。

マルチインデックスの扱い(行ラベルがマルチの場合)

次は、行ラベルをマルチにしてみましょう。

Snag_90a0750c.png

かなりややこしいのですが、まず最初にnameとtime、messageを列ラベルとして設定しています。
次に、test = df.set_index(['name','time'])の部分でnameとtimeをインデックスとしてセットしているので、nameとtimeは列ラベルではなく行ラベルとしてのマルチインデックスになります。(下図参照)

Snag_909ba5f7.png

では、device1のデータだけを抜き出してみましょう。

Snag_90a0a3ad.png

ちなみに、device1と2020で絞り込む場合は以下になります。
locの中身を配列ではなくタプルで指定することで絞り込みが可能です。

Snag_90a2dd22.png

最後に

マルチインデックスる利用することで、列や行をグループ化することができ、より分かりやすいデータ処理をすることができるようになります。
最初見たときは私も全然わかりませんでしたが、この記事が少しでも理解の助けになれば幸いです。
では(^▽^)

24
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
25