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()
の方が直感的。
- 可視化の前処理
- 例えば
matplotlib
やseaborn
に渡す前にデータを「横持ち形式」に整える。
- 例えば
まとめ
unstack()
= MultiIndexの行インデックスを列方向に変形する。stack()
の逆操作。groupby
の後やクロス集計のときに便利。level
でどの階層を展開するか指定可能。
以上、PythonのPandasのunstackについてでした。
最後までお読みいただき、ありがとうございました。