マルチインデックスの設定された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は次のように指定されています。
それでは平均値を取得するmeanメソッドを例に使い方を見ていきましょう。
コード例
まず 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
また、複数のLevelをリストとして指定することも可能です。
コメント