マルチインデックスが設定されたDataFrameの統計量の取得【Python】

マルチインデックスの設定されたDataFrameから、カテゴリ化した統計量を取得する方法を解説します。

ここでは、以下のようにpandasをインポートしているものとして進めていきます。

import pandas as pd

サンプルデータ

ここではseabornのtipsデータセットのサブセット(一部改変)を用います。

以下のようにしてDataFrameに取り込みできます。

df = pd.read_excel(r'https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-tips-1.xlsx')

マルチインデックスでカテゴリ化した統計量の取得

統計量を取得するメソッド(count, max, mean, median, min, std, var)にはlevel引数の設定が可能になっています。このlevel引数でどのマルチインデックスでカテゴリ化して統計量を取得するかを指定することができます。

ここで、マルチインデックスのLevelは次のように指定されています。

コード例

まず Level 0 の day でカテゴリ化して平均値を求めてみます。

df = df.set_index(['day', 'time', 'sex'])
print(df.mean(level=0))

※ df : サンプルデータ

      total_bill       tip      size
day
Sun    13.665000  1.335000  2.500000
Sat    19.830000  3.836667  2.333333
Fri    19.070000  2.500000  2.000000
Thur   20.203333  2.833333  2.666667

このように曜日ごとの平均値が取得できました。

次に、Level 1 の time でカテゴリ化して平均値を求めてみます。

df = df.set_index(['day', 'time', 'sex'])
print(df.mean(level=1))

※ df : サンプルデータ

        total_bill       tip      size
time
Dinner     20.6900  3.047143  2.428571
Lunch      14.9525  2.212500  2.250000

このように時間帯ごとの平均値が取得できました。

同様に Level 2 の sex でカテゴリ化して平均値を求めてみます。

df = df.set_index(['day', 'time', 'sex'])
print(df.mean(level=2))

※ df : サンプルデータ

        total_bill       tip      size
sex
Female   13.577500  1.897500  2.000000
Male     21.475714  3.227143  2.571429

このように性別ごとの平均値が取得できました。

ここではmeanメソッドを用いましたが、どのメソッドでも全く同様に扱うことができます。

補足

なお、Level の設定は数字だけではなく、行ラベル名で指定することも可能です。
例えば、次のようになります。

df = df.set_index(['day', 'time', 'sex'])
print(df.mean(level='time'))

※ df : サンプルデータ

        total_bill       tip      size
time
Dinner     20.6900  3.047143  2.428571
Lunch      14.9525  2.212500  2.250000

関連記事・スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です