PythonのPandasのunstackについて

Python,イメージ

AI実装検定のご案内

Pandasの unstack() は、行方向(行インデックス)を列方向に“展開”して、表をワイド形式に変形するメソッドです。

特に階層的なインデックス(MultiIndex)を持つDataFrameやSeriesで使うことが多いです

以下で詳しく解説します。

目次

基本のイメージ

  • stack() が「列 → 行」への変形
  • unstack() が「行 → 列」への変形

つまり、「行を列に持ち上げる」のが unstack です。

多くの場合、groupby + sum() のような集計後に、見やすい形に整えるのに使われます。

例:Seriesでのunstack()

import pandas as pd

# サンプルデータ
data = pd.Series(
    [10, 20, 30, 40],
    index=pd.MultiIndex.from_product([['A', 'B'], ['x', 'y']])
)
print(data)

出力

A  x    10
   y    20
B  x    30
   y    40
dtype: int64

ここで unstack() を使うと

print(data.unstack())

出力(DataFrameに変換される)

     x   y
A   10  20
B   30  40

行の階層(外側の 'A','B')を残して、内側のインデックス('x','y')が列に展開されます。

DataFrameでのunstack()

DataFrameにも同じように適用できます。

例えば

df = pd.DataFrame({
    "city": ["Tokyo", "Tokyo", "Osaka", "Osaka"],
    "year": [2020, 2021, 2020, 2021],
    "sales": [100, 120, 90, 95]
})
print(df)

出力

    city  year  sales
0  Tokyo  2020    100
1  Tokyo  2021    120
2  Osaka  2020     90
3  Osaka  2021     95

まず set_index でMultiIndexにします。

df2 = df.set_index(["city", "year"])
print(df2)

出力

            sales
city  year
Tokyo 2020    100
      2021    120
Osaka 2020     90
      2021     95

ここで unstack("year") をすると

print(df2.unstack("year"))

出力

       sales
year    2020  2021
city
Tokyo    100   120
Osaka     90    95

yearが列に展開され、都市ごとの年次売上表になります。

これで「クロス集計表」のように使えるわけです。

引数

  • level : どの階層を列に展開するか(インデックスが多階層の場合に指定)
    • 数値(0,1,2…)でもラベル名でも指定可能
  • fill_value : 欠損値を埋める値を指定可能 df2.unstack("year", fill_value=0)

よくある使いどころ

  • groupby の結果を表形式にしたいとき df.groupby(["city","year"])["sales"].sum().unstack()
  • クロス集計(pivot_table の代替)
    • pivot_table と違って集計関数を指定できないが、すでに集計済みなら unstack() の方が直感的。
  • 可視化の前処理
    • 例えば matplotlibseaborn に渡す前にデータを「横持ち形式」に整える。

まとめ

  • unstack() = MultiIndexの行インデックスを列方向に変形する。
  • stack() の逆操作。
  • groupby の後やクロス集計のときに便利。
  • level でどの階層を展開するか指定可能。

以上、PythonのPandasのunstackについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次