6.3 ピボット
データフレームをロングにするには, .melt()
メソッド14が有効です. 例えば以下は, 列 x
を軸にして, 他の変数をまとめてロングにします. 表 6.1 の左から右へ変換するイメージです. ロング形式への変換は, 7 章で紹介する plotnine
でグラフを描く際によく使います.
= ['x']) df.melt(id_vars
x | y | z | x | variable | value |
---|---|---|---|---|---|
A | 2.3738 | 2 | A | y | 2.3738 |
B | 2.7008 | 3 | A | z | 2 |
C | -0.9142 | 4 | B | y | 2.7008 |
D | 1.5888 | 1 | B | z | 3 |
E | 0.5829 | 2 | C | y | -0.9142 |
A | 0.0764 | 4 | C | z | 4 |
B | 1.0283 | 5 | D | y | 1.5888 |
C | -1.8603 | 0 | D | z | 1 |
D | 0.6499 | 2 | E | y | 0.5829 |
E | 0.8715 | 2 | E | z | 2 |
逆にワイドにするのは, やや面倒です qiitaの記事 にも書きましたが, 行に対応する軸を指定しなければ, 意図したとおりに変形してくれません. 今度は表 6.1 の右側から左側に戻すことをイメージしてください.
例えば以下のようなプログラムでは, 意図したとおりになりません.
='x', columns='variable', values='value') df.pivot(columns
> ValueError: Index contains duplicate entries, cannot reshape
一旦軸となる列を新規に作る必要があります.
df.assign(=lambda d: sorted(
rowlist(range(d.shape[0] // d.variable.nunique()))) * d.variable.nunique()
=['row', 'x'], columns='variable', values='value') ).pivot(index
古いバージョンでは
pandas.melt
で呼び出す必要がありましたが, 今はデータフレームのメソッドに定義されているため, よりシンプルに書けるようになりました.↩︎