この記事では、Pythonのデータ解析ライブラリであるpandasのpivot_table関数について詳しく解説する。pivot_table関数は、行と列を指定して、集計を行うことができる強力な機能であり、ビジネスやデータ分析でよく使われている。本記事では、pivot_table関数の基本的な使い方や、総計を算出する方法、値の算出方法の指定、欠損値の処理などについて、実際のデータを使って解説する。
データの用意
pivot_table関数を説明するためのサンプルデータを用意する。ここでは、以下のような注文データを考える。
顧客名 | 商品名 | 注文数 | 注文日 |
---|---|---|---|
A社 | 商品1 | 2 | 2021/01/01 |
A社 | 商品2 | 1 | 2021/01/02 |
A社 | 商品1 | 3 | 2021/01/03 |
B社 | 商品1 | 1 | 2021/01/02 |
B社 | 商品2 | 2 | 2021/01/02 |
B社 | 商品1 | 5 | 2021/01/04 |
これを以下のように読み込む。
colums = ['顧客名', '商品名', '注文数', '注文日']
values = [
['A社', '商品1', '2', '2021/01/01'],
['A社', '商品2', '1', '2021/01/02'],
['A社', '商品1', '3', '2021/01/03'],
['B社', '商品1', '1', '2021/01/02'],
['B社', '商品2', '2', '2021/01/02'],
['B社', '商品1', '5', '2021/01/04']
]
df = pd.DataFrame(values, columns=colums)
print(df)
顧客名 商品名 注文数 注文日
0 A社 商品1 2 2021/01/01
1 A社 商品2 1 2021/01/02
2 A社 商品1 3 2021/01/03
3 B社 商品1 1 2021/01/02
4 B社 商品2 2 2021/01/02
5 B社 商品1 5 2021/01/04
基本的な使い方
pivot_table関数を使って、商品ごとの注文数の小計を算出する。
pt = pd.pivot_table(df, index="商品名", values="注文数", aggfunc="sum")
print(pt)
注文数
商品名
商品1 11
商品2 3
index
引数に列名を指定することで、行になる列を指定できる。ここでは”商品名”列を指定している。values
引数に列名を指定することで、集計する値となる列を指定できる。ここでは”注文数”列を指定している。aggfunc
引数に集計方法を指定することで、集計方法を指定できる。ここでは”sum”(合計)を指定している。
引数marginsを使って総計を算出する方法
pivot_table関数に引数margins=True
を指定することで、行と列の小計と総計を算出できる。
pt = pd.pivot_table(df, index="商品名", columns="顧客名", values="注文数", aggfunc="sum", margins=True)
print(pt)
顧客名 A社 B社 All
商品名
商品1 5.0 6 11.0
商品2 1.0 2 3.0
All 6.0 8 14.0
columns
引数に列名を指定することで、列になる列を指定できる。ここでは”顧客名”列を指定している。margins
引数にTrueを指定することで、すべての小計と総計を計算できる。
引数aggfuncを使って値の算出方法を指定する方法
pivot_table関数に引数aggfunc
を指定することで、集計方法を指定できる。デフォルトでは”mean”(平均)が使われるが、”sum”(合計)など、任意の関数を指定することができる。
import numpy as np
pt = pd.pivot_table(df, index="商品名", columns="顧客名", values="注文数", aggfunc=np.max, margins=True)
print(pt)
顧客名 A社 B社 All
商品名
商品1 3.0 5 5
商品2 1.0 2 2
All 3.0 5 5
aggfunc
引数にnumpyの関数を指定することで、任意の関数を指定できる。ここではnp.max
を指定している。
引数dropnaを使って欠損値を除外する方法
pivot_table関数に引数dropna=True
を指定することで、欠損値を除外して集計できる。
df2 = pd.DataFrame({
"顧客名": ["A社", "A社", "B社", "B社"],
"商品名": ["商品1", np.nan, "商品2", "商品1"],
"注文数": [2, 3, 1, 5]
})
pt = pd.pivot_table(df2, index="顧客名", columns="商品名", values="注文数", aggfunc="sum", dropna=True)
print(pt)
商品名 商品1 商品2
顧客名
A社 2.0 3.0
B社 5.0 1.0
欠損値を含む行は集計の対象外になるため、”商品1″と”商品2″の小計が算出されている。
コメント