🍓

MultiIndexのデータフレームを通常のデータフレームに直す

2024/06/30に公開

はじめに

Pythonで"気づいたらマルチインデックスのままデータテーブル作っちゃった"っていう状態に陥ってしまった私の沼からの脱却メモです。
※もっとシンプルで完結しているコードがあると思います。

症状

以下の例に説明します。
department,age,salaryカラムを持つデータがあって、department毎のdescribeを見たい。そして、describeのデータテーブルを新しく作りたい、とします。

import pandas as pd

# サンプルのデータフレームを作成
data = {
    'age': [23, 25, 31, 35, 45, 55, 62, 42, 38, 28],
    'salary': [50000, 60000, 65000, 70000, 80000, 120000, 110000, 75000, 85000, 58000],
    'department': ['HR', 'HR', 'IT', 'IT', 'Finance', 'Finance', 'HR', 'Finance', 'IT', 'HR']
}
df = pd.DataFrame(data)

# 部門ごとにグループ化して要約統計量を取得
grouped_summary = df.groupby('department').describe()

# 結果の表示
print(grouped_summary)

結果はこうなります。age,salaryのマルチインデックスで出力されます。

ここから、グループ化されたカラムがインデックスになっているのでそれを解消します。

grouped_summary.reset_index(drop=False, inplace=True)
grouped_summary

そうするとこうなっちゃって、カラムレベル(インデックスレベル)が2層になってしまいます。

改善方法

まず、describe結果を別の引数に渡し、もとのデータフレームのうちグループ化したカラムだけ残してあとはドロップします。

grouped_summary_age = grouped_summary["age"]
grouped_summary_salary = grouped_summary["salary"]

grouped_summary.drop(["age","salary"],axis=1, level=0, inplace=True)

そのあと、groupd_summaryはLevel=0にカラム名が入って、Level=1には空の状態になっています。このままだと、かなり厄介。データフレームの結合などでエラーが出てしまいます。

grouped_summary

これを一旦カラム名を空にしてから再度同じカラム名を入れてデータフレームを確認すると、

grouped_summary.columns = [""]
grouped_summary.columns = ["department"]
grouped_summary

このようにマルチインデックス解除成功です。あとは、別の引数に渡していたデータフレームをmargeすれば完了です。今回の場合は、接尾語にそれぞれ"age"と"salary"を付ける必要がありそうですね。

grouped_summary_age_salary = pd.merge(
    grouped_summary_age,
    grouped_summary_salary,
    how="outer",
    left_index=True,
    right_index=True,
    suffixes=("_age","_salary"))

grouped_summary = pd.merge(
    grouped_summary,
    grouped_summary_age_salary,
    how="outer",
    left_index=True,
    right_index=True)

grouped_summary

以上となります。

Discussion