Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
13
Help us understand the problem. What are the problem?

posted at

updated at

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

はじめに

はんなり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

最後に

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
13
Help us understand the problem. What are the problem?