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