Pandas入門講座|10.データ集計(pivot_table)の方法【PythonのライブラリPandas】

はじめに

こんにちは。キノコードです。
Excelでよく使われるピボットテーブルですが、Pythonのpandasでもできます。
Pandasでのピボットテーブル は、集計方法をカスタマイズすることが可能です。そのため、その会社独自の集計方法や、特殊な集計をすることができます。
データ集計、データ分析でよく使われるピボットテーブルをこの動画でぜひマスターをしましょう。
読み込む前の準備として概要欄に記載したキノコードのサイトにExcelファイルを用意しています。
それをダウンロードして、学習用のJupyter Labを保存しているフォルダにに保存してください。
それではパソコン画面に切り替えてレッスンを進めていきましょう。

Pandasのインポート

import pandas as pd

まず、Pandasをインポートする記述を書きます。
「as」を使ってPandasを「pd」という名前で使えるようにしましょう。
実行します。

表示する列数・行数を変更

pd.options.display.max_rows = 10
pd.options.display.max_columns = None

表示する列数・行数を変更をします。
pd.options.displayで変更をしてみましょう。
pd.options.display.max_rowに10を代入します。
これで表示する行数を10行に変更することができます。
次に、表示する列数の変更をします。
max_columnsと書いて、Noneを代入します。実行します。
これで表示する列数・行数を変更ができました。

データフレームの読み込み

df = pd.read_excel(‘sample.xlsx’,sheet_name=’実績管理表’)
df

続いてレッスンで使うデータを説明します。
前回と同じく、Excelデータを使います。
このデータはあるアパレル会社の販売データになります。
社員ごとに何をいくら売り上げたのかがわかります。
このExcelの中の実績管理表というシートを使います。
エクセルを読み取るにはread_excelメソッドを使います。このメソッドは、レッスン6で説明しています。
エクセルのシートを指定して読み取りましょう。
sheet_nameという引数に実績管理表を渡します。
実行してみましょう。
読み取れました。

ピボットテーブルとは

pivot_tableのコードを書いていく前に、まずピボットテーブルとはなんでしょうか?
ピボットテーブルは、簡単にいってしまうとクロス集計表です。
クロス集計表とは、2つのカテゴリのデータを同時に集計したものです。
例えば、これは売上管理表の「氏名」と「商品分類」のカテゴリをもとに、売上を合計したものです。
確かに、2つのカテゴリのデータを同時に集計したものですよね。
クロス集計表のことをエクセルやPandasではピボットテーブルといっています。
ピボットとは軸という意味で、テーブルは表という意味です。
氏名や性別、商品分類、商品名などいろいろな軸を変えて、表にすることができるのでピボットテーブルといいます。
ピボットテーブルの便利なところはどんなところでしょうか?
例えば、前回のレッスンのgroupbyでは、氏名の列でグループ化をして合計や平均の集計ができます。
つまり、縦方向にデータを集計していました。
ピボットテーブルは、縦方向に加えて、横方向にも項目を追加して集計することができます。
つまり、2つのカテゴリのデータを一度にみることができ、それぞれのデータの違いが明確になります。
ピボットテーブル 、つまり、クロス集計は、データ分析ではシンプルだけど非常にわかりやすい分析手法です。
Pythonでのやり方をぜひマスターしてください。
それでは早速ソースコードをみていきましょう。

ピボットテーブルの書き方

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’, aggfunc=’sum’)
df_pivot

それでは、氏名と商品分類で売上金額の合計を算出してみましょう。
dfドット、pivot_table丸括弧。引数indexに氏名、coluumnsに商品分類、valuesに集計するデータの売上金額を指定します。そしてaggfuncという引数が集計方法です。sumを渡して合計を算出します。
売上の集計であれば、valuesに売上金額を記述し、例えば、数量の集計であれば、valuesに数量。単価であればvaluesに単価を記述します。
そしてaggfuncという引数が集計方法です。sumを渡して合計を算出します。
実行します。
クロス集計表、ピボットテーブルができあがりました。

小数点以下を省略

df_pivot = df.pivot_table(index=’氏名’,values=’売上金額’, aggfunc=’sum’)
df_pivot

ちなみに、columnsを設定せずにindexだけ設定すればgroupbyのような使い方ができます。
実行しましょう。
groupbyのような使い方ができますね。

平均算出

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’, aggfunc=’mean’)
df_pivot

次に平均を算出してみましょう。
引数aggfuncにmeanを渡します。実行します。平均を算出できました。

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’)
df_pivot

ちなみに、デフォルトはmeanになっています。
したがって、何も入力しない場合は平均が算出されます。
確認をしてみましょう。実行します。
平均が算出されました。

小数点以下を省略

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’)
df_pivot.applymap(‘{:,.0f}’.format)

ただし、このデータは、小数点以下があってみにくいです。
前回のgroupbyのレッスンでも説明しましたが、こういう場合は桁区切りを使用しましょう。
applymapとformatを使います。
applymapについては、このPandas入門コースで説明し、format関数についてはPython入門コースでじっくり説明する予定です。
チャンネル登録をしてお待ち頂けましたら幸いです。
実行します。
みやすくなりましたね。

複数データの集計

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=[‘単価’,’数量’,’売上金額’], aggfunc=’mean’)
df_pivot.applymap(‘{:,.0f}’.format)

複数のデータの平均を同時に算出することもできます。
引数valuesに、集計したいデータをリストで渡します。
実行します。
集計が同時にできました。

df_pivot = df.pivot_table(index=[‘氏名’,’売上日’], columns=’商品分類’,values=’売上金額’, aggfunc=’sum’)
df_pivot.applymap(‘{:,.0f}’.format)

indexやcolumnsに複数のカテゴリを設定することができます。
indexを氏名と売上日の2つを設定してみましょう。また、集計方法を合計にしてみましょう。
実行します。
氏名の売上日ごと、そして商品分類の売上の合計を算出することができました。

Nan置き換え

nanのところが気持ち悪いですよね。
nanのところを数値に置き換えることができます。

df_pivot = df.pivot_table(index=[‘氏名’,’売上日’], columns=’商品分類’,values=’売上金額’, aggfunc=’sum’,fill_value=0)
df_pivot.applymap(‘{:,.0f}’.format)

nanのところを0で埋めてみましょう。fill_valueという引数に0を渡します。
実行します。
0で埋めることができました。

groupbyのような集計

df_pivot = df.pivot_table(index=[‘氏名’,’売上日’], values=[‘売上金額’,’数量’], aggfunc=’sum’)
df_pivot.applymap(‘{:,.0f}’.format)

当然、インデックスを2つ、valuesところを2つ。columnsを削除するということもできます。氏名ごとの売上日で、売上と数量の合計を算出してみましょう。
実行します。
groupbyのような使い方で集計ができました。
pivot_tableを覚えてしまえば、groupbyメソッドを使わなくてもよくなるケースが多くなることがわかりますね

合計列追加

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’, aggfunc=’sum’)
df_pivot.applymap(‘{:,.0f}’.format)

最初でみた通常のピボットテーブルはこうでしたね。

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’, aggfunc=’sum’, margins=True)
df_pivot.applymap(‘{:,.0f}’.format)

ここに合計の列を追加してみます。
marginsにTrueを渡せばオッケーです。
実行します。
集計行が追加されました。

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’, aggfunc=’sum’, margins=True, margins_name=’合計’)
df_pivot.applymap(‘{:,.0f}’.format)

現在、合計行の名前がAllになっていますが、この名前を変更することができます。
margins_nameに名付けたい文字列を渡しましょう。
今回は合計とします。
実行します。
合計という名前の合計行が追加されました。

複数の集計方法

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’, aggfunc=[‘sum’,’mean’,’count’])
df_pivot.applymap(‘{:,.0f}’.format)

複数の集計方法を同時に実行することもできます。
aggfunのところにリストで集計方法をわたしてあげればよいです。
合計、平均、個数のカウントの3つをわたしてみましょう。
実行してみます。
同時に集計することができました。

独自の集計方法

import numpy as np
def cal_tax(s):
return np.sum(s)*1.10

集計方法は、自分で定義した関数を使うことができます。
そのため、複雑な計算であったり、お勤めの会社の独自の計算をすることもできます。
今回はシンプルに合計の消費税込みの金額を算出してみましょう。
まず、税込みの計算のためにnumpyをインポートしましょう。
NumPyとは、高速にリストの計算をするためのライブラリです。このnumpyをnpという名前で使えるようにします。
関数の定義はdefでやります。
python超入門コース、レッスン12で関数の定義の方法をレクチャーしました。忘れた方は、復習で再度そちらをご覧ください。
今、右上にカードがでているはずです。
さて、関数の定義をしていきます。
まず、defと書いて、関数名を書きましょう。
今回は計算という意味のcalと税金のtaxで、cal_taxとします。
np.sumで合計を算出することができるので、これに対して1.10を掛け算します。
これをreturnで返しましょう。
この今定義したcal_taxの関数を使ってみましょう。

df_pivot = df.pivot_table(index=’氏名’, columns=’商品分類’,values=’売上金額’, aggfunc=cal_tax)
df_pivot.applymap(‘{:,.0f}’.format)

aggfuncのところに関数を記述するだけです。
じっこうしてみましょう。
合計をした上で、消費税の計算をすることができました。

pivotの使い方

df = pd.DataFrame({‘col01’:[‘A’, ‘A’, ‘B’, ‘B’], ‘col02’:[‘a’, ‘b’, ‘a’, ‘b’], ‘col03’:[1, 2, 3, 4]})
df

ちなみに、pivot_tableメソッドではなく、pivotというメソッドもあります。
使い方はほぼ同じです。
簡単なデータフレームをつくってみましょう。

df_pivot = df.pivot(index=’col01′, columns=’col02′,values=’col03′)
df_pivot

使い方はpivot_tableと同じです。
indexとcolumnsとvaluesにそれぞれカラム名を渡しましょう。
実行します。
集計できました。

df = pd.DataFrame({‘col01’:[‘A’, ‘A’, ‘B’, ‘B’], ‘col02’:[‘a’, ‘b’, ‘a’, ‘b’], ‘col03’:[‘X’, ‘Y’, ‘Z’, ‘W’]})
df

pivot_tableとpivotとの違いは、valuesの部分が値じゃなく文字列であっても集計できる点です。
col3のカラムを文字列にしてみましょう。
実行します。
このようなデータです。

df_pivot = df.pivot(index=’col01′, columns=’col02′,values=’col03′)
df_pivot

valuesにcol3を渡してもエラーになりません。
実行してみましょう。
集計ができました。

df_pivot = df.pivot_table(index=’col01′, columns=’col02′,values=’col03′)
df_pivot

同じコードをpivot_tableでやってみましょう。
実行します。
エラーになりました。

df_pivot = df.pivot_table(index=’col01′, columns=’col02′,values=’col03′,aggfunc=’first’)
df_pivot

ただし、集計方法のaggfuncのところの最初のデータを取得するfirstとすればエラーになりません。
実行します。
エラーにならず集計ができました。
細かいことをいうと、pivotはインデックス・列のペアが一意でない場合はエラーになるなどの違いもあります。
とはいえ、pivot_tableメソッドを覚えておけば大抵の集計や加工は問題なくできます。
まずはpivot_tableをマスターしましょう。

キノコードでは、Pandas入門コースの他に、仕事に活かせるPythonの自動化のレッスン、株のデータ分析のレッスンをアップしています。
また人工知能のレッスンや、Pythonでのグラフの作り方についてのレッスンをアップしていく予定です。
新着通知もいくのでぜひチャンネル登録をお願いします。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」

Excelファイルはこちら

Jupyter Labのファイルはこちら