pivot
関数は列、行のラベル対象を変更してデータ同士の相関を見やすくすることができるpivot関数があります。
この関数を使うことで、簡易的に見たいラベルを変更してDataFrameを構築し直すことができます。機能自体はpivot_table
関数でも実現可能ですが、pivot
関数なら非数値データでも対応可能です。pivot_table
関数はデータに対して平均値の算出など何かしらの処理を施した上で表を作成したいときに用い、特に必要でない時はpivot
関数を使うのが適切でしょう。
pivot_table
関数の詳しい使い方はこちら。
Pandasでピボットテーブルを手軽に作成するpivot_table関数の使い方 /features/pandas-pivot.html
本記事ではpivot関数を使って、ラベル対象を変更し、DataFrameを再構築する手法を学びます。使い方がシンプルで、手軽にデータの見た目を変更することができるようになります。
pivot関数
pivot
関数はインデックスラベル、カラムラベル、そしてデータ部分を元のDataFrameから選択することで新たなDataFrameを作成する関数です。
使い方を詳しく見ていきます。
APIドキュメント
まずはAPIドキュメントからです。
pandas.DataFrame.pivot(index=None,columns=None,values=None)
params:
パラメータ名 | 型 | 概要 |
---|---|---|
index | strまたはobject | (省略可能)初期値None 新たに作成するDataFrameのインデックスラベルに使用する列データを指定します。デフォルトでは元のDataFrameのインデックスラベルを使用します。 |
columns | strまたはobject | (省略可能)初期値None 新たに作成するDataFrameのカラムラベルに使用する列データを指定します。 |
values | str,objectまたは それらのリスト |
(省略可能)初期値None データ部分に使う列データを使用します。特に指定されないと残りの列データ全てがデータ部分となります。 |
returns:
再構築されたDataFrameが返されます。
特に変な引数があるわけでもなく、シンプルな構成となっています。
インデックスラベル、カラムラベル、データ部分の3つを個別に指定して新たなDataFrameを作成してくれます。
name,blood_type,class,state
Alice,A,high,NY
Bob,B,middle,OH
Chris,AB,low,ND
David,B,low,OH
Evan,O,low,NY
Fabian,O,middle,OK
Gari,A,high,DC
このデータをpivot_sample.csv
として使用します。
データのダウンロードは以下のリンクから。
表の再構築をする
まずはクラスと都市(state)をラベルにして名前をデータとしてみます。
In [1]: import pandas as pd
In [2]: df = pd.read_csv("pivot_sample.csv")
In [3]: df
Out[3]:
name blood_type class state
0 Alice A high NY
1 Bob B middle OH
2 Chris AB low ND
3 David B low OH
4 Evan O low NY
5 Fabian O middle OK
6 Gari A high DC
In [4]: df.pivot(index="class",columns="state",values="name")
Out[4]:
state DC ND NY OH OK
class
high Gari NaN Alice NaN NaN
low NaN Chris Evan David NaN
middle NaN NaN NaN Bob Fabian
valuesを指定しないと他の列データが全部入る
values
を特に指定しないとname
とblood_type
のデータが同時に表示されます。
In [5]: df.pivot(index="class",columns="state")
Out[5]:
name blood_type
state DC ND NY OH OK DC ND NY OH OK
class
high Gari NaN Alice NaN NaN A NaN A NaN NaN
low NaN Chris Evan David NaN NaN AB O B NaN
middle NaN NaN NaN Bob Fabian NaN NaN NaN B O
indexを特に指定しないと元のインデックスが適用される
次はindex
の指定を無くします。
インデックスラベルは元のDataFrameのものを使われるので0~6の連番です。
In [6]: df.pivot(columns="state",values="name")
Out[6]:
state DC ND NY OH OK
0 NaN NaN Alice NaN NaN
1 NaN NaN NaN Bob NaN
2 NaN Chris NaN NaN NaN
3 NaN NaN NaN David NaN
4 NaN NaN Evan NaN NaN
5 NaN NaN NaN NaN Fabian
6 Gari NaN NaN NaN NaN
被りはNG
ラベル同士の組み合わせで被りがあるとエラーが返ってきます。
class
とblood_type
をみてみると、
class="high", bloody_type="A"
のデータが2組存在してることがわかります。
このような場合、データを再構築できません。
In [7]: df.pivot(index="class",columns="blood_type",values="state")
---------------------------------------------------------------------------
(エラーメッセージが表示される)
ValueError: Index contains duplicate entries, cannot reshape
In [9]: df.pivot(index="blood_type",columns="class",values="name") # インデックスとカラムラベルとを入れ替えても同じ。
---------------------------------------------------------------------------
(エラーメッセージが表示される)
ValueError: Index contains duplicate entries, cannot reshape
まとめ
今回はpivot
関数の使い方についてまとめました。
手軽にデータの見た目を変えることが可能で、自分が見たい情報をみることが可能となります。
しかしながら、被りが存在するとうまく表を作ることができないので注意してください。