( New ) 新連載スタート!2人の会話形式でPythonを学ぶ「週末Pythonゆる講座」はこちら ▶▶

【Python】Pythonピボットテーブルを完全攻略|pivot_table

ピボットテーブルでデータを加工する

Excelのピボットテーブルと同様の機能がPythonのDataFrameにも存在します

pivot_tableの機能により「クロス集計表」も簡単に作ることができます

ピボットテーブルのイメージ

Excelでは「ピボットテーブルのフィールド」という、視覚的にも分かりやすいボックスが存在しますが

一方でPythonでは全てパラメータで記述する必要があります

こちらの記事で集計方法をご説明します

事前準備

Pandasというデータ解析を実施できるライブラリをインポートします 

import pandas as pd

※サンプルデータ:学校のテストの点数

学校のイメージ
import pandas as pd
# 本サイトから直接データを取得
df = pd.read_html('https://smart-hint.com/student-data/')[0]
df.head()
Python学習のための学校のテストのサンプルデータ

pivot_tableの使い方

pivot_tableは必須級のパラメータが複数存在します

最終的にどういうテーブルになっていればよいのかを想定して記述を始めてください

考えるべきポイントは5つ!

  1. 使うデータ(data
  2. まとめる項目(index
  3. 分割する項目(columns
  4. 計算する値(values
  5. 集計関数(aggfunc

この5つのポイントはそのままパラメータとして利用します

Pythonのピボットテーブルのイメージ

上記の図では「学校のテスト」のデータ(data)を使ってピボットテーブルを作っています

クラス」をまとめる項目(index)として、「性別」で分割(columns)しています

国語」の点数を値(values)として、「平均」を計算(aggfunc)しています

つまり「クラス×性別」ごとの平均点を出しています

聞きなれないワード「aggfunc」とは?

集計方法を設定する「aggfunc」は普段使わない単語ですが

正確には「Aggregate Function」で日本語では「集計関数」という意味です

パラメータ

おすすめ度を判定:★★★=必須|★★☆=推奨|★☆☆=任意

★★★:data(対象データ)

pd.pivot_table(df)

まずはdataで利用するDataFrameを指定しましょう

dataとは書いていますが、そのままDataFrameの変数名を記述します

今回はサンプルデータの変数「df」を指定しています

またメソッドとして利用することも可能です

df.pivot_table()

★★★:index(まとめる項目)

df.pivot_table(index='class', values='english')

indexではピボットテーブルでまとめたい項目を指定します

今回はindexにクラス(1~8組)を指定してみます

※後述しますが、valuesに英語の点数を指定します

Pythonピボットテーブルのindex指定

複数の項目でまとめる(マルチインデックス)には、元のデータの列名を[ ]リストで指定してください

例として性別と部活の種類をリストとして記述します

df.pivot_table(index=['sex','club_athletic'], values='english')
Pythonピボットテーブルのマルチインデックス

★★☆:columns(分割する項目)

df.pivot_table(index='class', columns='sex', values='english')

続いて分割する項目としてcolumnsを指定します

ピボットテーブルでは列(カラム)としてアプトプットされます

クラスごとの数値を「性別」でも分けてみましょう

Pythonピボットテーブルのcolumnsの指定

indexcolumnsを指定することで、クロス集計表を作成することができました


こちらも元のデータの列名をリストで記述することで、マルチカラムとなります

df.pivot_table(index='class', columns=['sex','club_athletic'], values='english')
Pythonピボットテーブルのマルチカラム

★★★:values(計算する値)

df.pivot_table(index='class', values='english')
Pythonピボットテーブルのvalues指定

valuesではピボットテーブルで表示したい「」を記載します

元のデータから数値型の列を抽出してください


複数の数値を指定することもできます

「国語」「数学」「英語」の3つの点数を[ ]リスト形式で値に入れてみましょう

df.pivot_table(index='class', values=['japanese','math','english'])
Pythonピボットテーブルの複数のvalues指定

もしvalues記載しない場合は、数値型の情報が全て抽出されます

df.pivot_table(index='class') #valuesの記載なし
Pythonピボットテーブルのvaluesを指定しない場合

今回の例ではindexのみ「クラス」を指定しvaluesを指定していません

すると「国語」「数学」「英語」の数値型の点数に加えて、生徒番号運動部化の有無も抽出されました

★★★:aggfunc(集計関数)

df.pivot_table(index='class', values='english', aggfunc='mean')

aggfuncでは集計関数、つまり計算する方法を指定します

記載がない場合は「平均:np.mean」が採用されます

  • mean:平均
  • sum:合計
  • max:最大値
  • min:最小値
  • count:件数

指定方法は「np.mean」と指定しても、「’mean’」と指定しても結果は同じです

それぞれの集計方法を抽出するには、リストで記述しましょう

df.pivot_table(index='class', values='english',
               aggfunc=('min','max','mean'))
Pythonピボットテーブルのaggfunc

国語の点数の「最大値・平均値・最小値」を抽出してみました

★☆☆:margins(総計)

df.pivot_table(index='class', columns='sex', values='english',
               margins=True)

marginsをパラメータで「True」を設定することで、「総計」を表示することができます

総計といっても平均の場合は全体の平均値になります

デフォルトでは「False」で設定されており、「総計」は表示されません

Pythonピボットテーブルの総計

★☆☆:margins_name(総計の名前)

df.pivot_table(index='class', columns='sex', values='english',
               margins=True, margins_name='総計')

margins=Trueで設定した総計に対し、margins_nameで任意の名前を付けることができます

Pythonピボットテーブルの総計

※インデックスを解除する方法

df.pivot_table(index=['sex','club_athletic'],
               values='english').reset_index()

ピボットテーブルを加工する際に「インデックス」の構造では扱いにくくなることがあります

そこでreset_indexのメソッドを利用し、インデックスを解除することができます

「0.1.2.3…」と数字の連番がインデックスとして追加されます

Pythonのピボットテーブルのインデックスリセット

まとめ

今回はPythonのデータを集計する際によく使うpivot_tableをご紹介してきました

基本的な使い方を覚えてしまえば、Pythonのデータ加工が非常に楽になります

ぜひ覚えて使ってみてください

お気に入り登録お願いします

コメントを残す

メールアドレスが公開されることはありません。