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として使用します。

データのダウンロードは以下のリンクから。

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を特に指定しないとnameblood_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

ラベル同士の組み合わせで被りがあるとエラーが返ってきます。

classblood_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関数の使い方についてまとめました。 手軽にデータの見た目を変えることが可能で、自分が見たい情報をみることが可能となります。 しかしながら、被りが存在するとうまく表を作ることができないので注意してください。

参考