6.3 ピボット

データフレームをロングにするには, .melt() メソッド14が有効です. 例えば以下は, 列 x を軸にして, 他の変数をまとめてロングにします. 表 6.1 の左から右へ変換するイメージです. ロング形式への変換は, 7 章で紹介する plotnine でグラフを描く際によく使います.

df.melt(id_vars = ['x'])
表 6.1: .melt() メソッドのイメージ
変換前
変換後
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 の右側から左側に戻すことをイメージしてください.

例えば以下のようなプログラムでは, 意図したとおりになりません.

df.pivot(columns='x', columns='variable', values='value')
> ValueError: Index contains duplicate entries, cannot reshape

一旦軸となる列を新規に作る必要があります.

df.assign(
    row=lambda d: sorted(
      list(range(d.shape[0] // d.variable.nunique()))) * d.variable.nunique()
).pivot(index=['row', 'x'], columns='variable', values='value')

  1. 古いバージョンでは pandas.melt で呼び出す必要がありましたが, 今はデータフレームのメソッドに定義されているため, よりシンプルに書けるようになりました.↩︎