データ分析の中で、特定の集計期間中「購入を行なっていない」顧客を調べることがあったので、これをpandasで調べる方法を紹介する。
サンプルデータフレームの用意
以下のような二つのデータフレームがあるとする。
import pandas as pd
# 売上データ
df_uriage = pd.DataFrame([['2019-06-13', '0001', 3, '0001'],
['2019-07-13', '0002', 5, '0002'],
['2019-08-13', '0003', 4, '0001'],
['2019-09-13', '0001', 1, '0003']],
columns=['売上日', '商品ID', '数量', '顧客ID'])
print(df_uriage)
# 売上日 商品ID 数量 顧客ID
# 0 2019-06-13 0001 3 0001
# 1 2019-07-13 0002 5 0002
# 2 2019-08-13 0003 4 0001
# 3 2019-09-13 0001 1 0003
# 顧客データ
df_customer = pd.DataFrame([['0001', '山田太郎', '大阪府'],
['0002', '鈴木一郎', '東京都'],
['0003', '佐藤あゆみ', '北海道'],
['0002', '田中将太', '福岡県']],
columns=['顧客ID', '氏名', '都道府県'])
print(df_customer)
# 顧客ID 氏名 都道府県
# 0 0001 山田太郎 大阪府
# 1 0002 鈴木一郎 東京都
# 2 0003 佐藤あゆみ 北海道
# 3 0002 田中将太 福岡県
今回はわかりやすく各4行のデータを用意したので一目で分かるが、実際のシステムで「購入を行なっていない」顧客を調べるとなったらなかなか骨が折れるだろう。
二つのデータを結合し、rightジョインで調べる
二つのデータフレームをmerge関数で結合する。
ここでポイントとなるのが「how=’right’」。
rightジョインで結合することで、購入を行なっていない顧客の売上データの値が欠損値を表す「NaN」となる。
away_data = pd.merge(df_uriage, df_customer, left_on='顧客ID', right_on='顧客ID', how='right')
print(away_data)
# 売上日 商品ID 数量 顧客ID 氏名 都道府県
# 0 2019-06-13 0001 3.0 0001 山田太郎 大阪府
# 1 2019-08-13 0003 4.0 0001 山田太郎 大阪府
# 2 2019-07-13 0002 5.0 0002 鈴木一郎 東京都
# 3 2019-09-13 0001 1.0 0003 佐藤あゆみ 北海道
# 4 NaN NaN NaN 0004 田中将太 福岡県
購入を行なっていない顧客(欠損値が含まれている行)のみを抽出したい場合は、以下のようにisnull関数を使うと良い。
away_data[away_data['売上日'].isnull()]
# 売上日 商品ID 数量 顧客ID 氏名 都道府県
# 4 NaN NaN NaN 0004 田中将太 福岡県
今回はpandasを使った例を紹介したが、通常のSQLでもrightジョインを使ってこのような集計を行うことができる。