Pandasのピボットテーブルを使うと行と列を変換し、指定したグループ単位で簡単に集計(合計値、平均値、カウント数など)ができるので、データ分析や売上UPにつながる付加価値データの作成ができます。
エクセルなどGUIベースのピボットテーブルは操作が簡単ですが、Pandasのピボットテーブルはコード入力なので明確に理解する必要があります。正直忘れてしまうので、いつでも見返せるように本記事を作成致しました。ピボットテーブルの迷いやすいポイントやよく使うコード例をご紹介することで、皆様が簡単にピボットテーブルを使えることを目指します。
Pandasのピボットテーブルが使えるメリット
ピボットテーブルは簡易的に集計できるので、少ないコードで早くアウトプットが出せて保守対応も簡単です。例えば、ピボットテーブル機能がないSQLで同じ結果を出すには、繰り返し同じ構文を長く記述する必要があり現実的ではありません。
ピボットテーブルは集計用として用いられるだけでなく、データの縦横変換にも使えます。データ加工の幅が広がることで価値あるデータを産み出すことができるのです。本記事では、便利なピボットテーブル機能を利用したことがない方に向けて、簡単なサンプルデータとピボットテーブルの操作体験ができるコードを記述しましたので、ご活用くださいませ。
Pandas pivot_tableの使い方
dataframe.pivotとdataframe.pivot_tableの違い
Pandasのピボットテーブルにはdataframe.pivotとdataframe.pivot_tableの2つのメソッドがありますが、dataframe.pivot_tableだけ覚えれば大丈夫です。dataframe.pivotは簡易版なので一部機能のみですがdataframe.pivot_tableは全ての機能を利用でき高度な操作や柔軟性があります。
体験用のサンプルデータを紹介
ピボットテーブル体験用のサンプルデータを作成しましたのでご自由にご利用くださいませ。サンプルデータは私が好きなおやつを元に作成し、最初の5行を下記に表示しました。(下記)
import pandas as pd
df1=pd.read_csv(r"C:\Users\abi00\Desktop\sample_1.csv")
#最初の5行のみ表示
df1.head(5)
売上日 | 大カテゴリ | 中カテゴリ | 単価 | 売上数量 | 売上金額 | 商品ID | 商品名 |
---|---|---|---|---|---|---|---|
2020-06-27 | おやつ | たいやき | 4000 | 5 | 20000 | 0 | たいやきみかん |
2020-01-25 | おやつ | たいやき | 4000 | 5 | 20000 | 1 | たいやきおれんじ |
2020-12-22 | おやつ | たいやき | 4000 | 6 | 24000 | 2 | やきいもたいやき |
2020-08-04 | おやつ | たいやき | 4000 | 7 | 28000 | 3 | あんこたいやき |
2020-01-22 | おやつ | たいやき | 4000 | 1 | 4000 | 4 | 栗たいやき |
dataframe.pivot_tableの使い方
ピボットテーブルは表示させたい項目(列)やインデックス(行)をグループ表示させ、集計値(合計値や平均値など)を指定する機能があります。
下記にdataframe.pivot_tableの構造を示します。
DataFrame.pivot_table(index=”インデックス名”,columns=”項目名”,values=”集計したい項目名値”,margins=”小計・総計の表示有無”,aggfunc=”集計方法”)
dataframe.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True)
データがアウトプットされる視点で記載してみます。
- columns:列にする項目を指定
- index:行にする項目を指定
- values:値として使用する列を指定 ※aggfuncを利用した集計関数として下記が存在
・sum:合計
・mean:平均
・max:最大
・min:最小
・count:件数 - margins:値をTrueにするとピボットテーブルの最後行列に合計値を表示
- dropna:値をTrueにすると欠損値が含まれる行や列を除外
これらのパラメータを適切に指定することで、目的に応じたピボットテーブルを作成することができます。
dataframe.pivot_tableを体験
サンプルデータでピボットテーブルを実行
先程のサンプルデータを利用し、下記パラメーターを入れたコードを実行してみましょう。
①行指定(index) → 中カテゴリ
②列指定(columns) → 大カテゴリ
③値指定(values) → ”売上数量”
④集計関数(aggfunc)→ count指定
import pandas as pd
df1=pd.read_csv(r"C:\Users\abi00\Desktop\sample_1.csv")
df1=df1.pivot_table(index="中カテゴリ", columns="大カテゴリ", values="売上数量", aggfunc = 'count')
#表示の便宜上インデックスをリセットします。
df1.reset_index()
結果をみると行と列が中カテゴリ、大カテゴリ毎に表示され集計された数量の合計値が値として格納されております。
次に集計値をcountからsumに変えることで売上数量の合計値を表示させます。
df1=df1.pivot_table(index="中カテゴリ", columns="大カテゴリ", values="売上数量", aggfunc = 'sum')
#表示の便宜上インデックスをリセットします。
df1.reset_index()
「値が存在する数量」から「数量の合計値」に変わったことがわかります。
aggfuncパラメーターの使い方
集計値のNaNを除外したい場合は違う値に置き換えるオプション「fill_value=置換する値」を利用します。
df1=df1.pivot_table(index="中カテゴリ", columns="大カテゴリ", values="売上数量", aggfunc = 'sum',fill_value=0)
df1.reset_index()
これと同様の考えでaggfuncを「mean,max,min」に変更すると値も変化します。
marginsパラメーターの使い方
カテゴリ毎の小計や総計を表示させることも可能でmargins=True, margins_name=’つけたい名称’とすることで表示されます。
df1.pivot_table(index="Survived", columns="Sex", values="Fare", aggfunc = 'count', margins=True, margins_name='Total')
複数項目を指定する方法
今までの例は単一項目指定でしたが複数項目はlist型で指定でき[“中カテゴリ”,”売上日”]としました。
df1.pivot_table(index=["中カテゴリ","売上日"], columns="大カテゴリ", values="売上数量", aggfunc = 'sum',fill_value=0, margins=True, margins_name='Total')
valuesの値をmax、minで複数表記すると
df1.pivot_table(index=["Pclass","Survived"], columns="Sex", values="Fare", aggfunc = [max,min], margins=True, margins_name='Total')
値を複数に指定することも可能でvalues=[“売上数量”,”売上金額”]とするコードと結果です。
df1.pivot_table(index=["中カテゴリ"], columns="大カテゴリ", values=["売上数量","売上金額"], aggfunc = 'sum',fill_value=0, margins=True, margins_name='Total')
pivot_table応用編
ユニーク値で集計する方法
値をユニーク化して件数を確認するにはlambdaを利用します。
df1.pivot_table(index="Survived", columns="Sex", values="Fare", margins=True, margins_name='Total', aggfunc = lambda x:len(x.unique()))
ユニーク化したことでカウント数が減少しました。
複数のvalesで違う集計関数を使う方法
valuesの値をlist型にしてカンマ区切りで複数記載します。agguuncにはvaluesで指定した項目ごとの集計関数を辞書値で登録します。
df1.pivot_table(index=["中カテゴリ"], columns="大カテゴリ", values=["売上数量","売上金額"],aggfunc ={"売上数量":"count","売上金額":"sum"},fill_value=0, margins=True, margins_name='Tota
valuesをカンマ区切りで出したい時
元データには、値が縦に並んでいるが値にすると横に並びます。
その時に、カンマなどで区切られていないと、もともとの値の境目がわからない。
この問題を解決するにはvaluesをlistとして出すことです。
df.pivot_table(index=["項目名"],values="",aggfunc = list)
上記のようにaggfuncにlistを指定することで、list式で出すことができます。
インデックスをリセットする方法
ピボットの集計結果を利用して更にデータ結合する場合はマルチインデックスになっているケースがあるのでインデックスをリセットしないと実行できないケースがあるのでやり方を説明します。
df1=df1.pivot_table(index="中カテゴリ", columns="大カテゴリ", values="売上数量", aggfunc = 'sum',fill_value=0)
df1.reset_index()
以下に具体的な例を示します
pivot_table = dataframe.pivot_table(values='値にする列名', index='行にする列名', columns='列にする列名', aggfunc='sum')
pivot_table = pivot_table.reset_index()
pandasの公式ドキュメントをご確認したいかたはこちらです。
ご質問やご依頼について
記事やDX化のご質問や依頼はServiceをご覧くださいませ。