【毎日Python】Pythonでデータフレームを縦持ちデータから横持ちに整形する方法|pandas.pivot

pandas.pivot
毎日Python/こつこつPython
import pandas as pd

Pythonで、縦持ちのデータを横持ちデータに整形する方法です。
使用するのは、Pythonのpandasライブラリのpivotメソッドです。
今回は、このようなデータフレームを用意します。
縦持ちとは、項目が増えたときに縦に増えるデータ構造のことを指し、横に増えるデータ構造を横持ちと言います。

df = pd.read_csv('./sample_data/data_melt.csv')
df
df.pivot(index='都道府県名', columns='和暦(年)', values='人口(男)')

まず、都道府県を軸に、西暦ごとの人口総数を表示してみましょう。
pivotの引数に、整形したいデータフレーム、インデックス、カラム、要素に指定したいカラムを指定します。
実行します。
指定した条件で表示することができました。

df.pivot(index='西暦(年)', columns='都道府県名', values=['人口(男)', '人口(女)'])

次に、要素の値を複数指定してみましょう。
値を複数指定する場合は、リストで指定します。
西暦年を軸に、都道府県ごとの男女の人口を表示できました。
インデックスに複数指定した場合は、マルチインデックス として表示されます。
都道府県コードと都道府県をインデックスに指定してみましょう。
マルチインデックス で表示できました。

df.pivot(index=['都道府県コード','都道府県名'], columns='西暦(年)', values='人口(総数)')

要素は省略することもできます。
省略した場合には、インデックスカラムで指定されなかったカラムが、全て要素の値になります。
実行します。
都道府県名と西暦年以外を要素として表示されました。

df.pivot(index='都道府県名', columns='西暦(年)')
df.pivot(index='都道府県名', columns='都道府県コード', values='人口(女)')

なお、インデックスとカラムの値が重複している場合にはエラーが返されます。
実行します。
都道府県名と都道府県コードの値が重複している為、エラーが返されました。

なお、似たメソッドでpivot_tableメソッドがあります。
pivot_tableメソッドは、クロス集計ができますが、pivotメソッドはデータの整形のみを行う点が異なります。

df.pivot_table(index='都道府県コード', columns='都道府県名', values='人口(総数)')

関連メソッド

【毎日Python】Pythonで横持ちのデータを縦持ちに整形する方法|pandas.melt

【毎日Python】Pythonでデータフレームからピボットテーブルを作成する方法|DataFrame.pivot_table

【毎日Python】Pythonで横持ちデータと縦持ちデータの整形|DataFrame.stack/unstack