##クロス集計とは:
項目を2つ以上掛け合わせて集計する手法。
・年齢10代、20代 回答数
・男、女、その他 回答数
このような2つの集計があったとして共通する回答数を中心とした掛け合わせた集計のこと。
これからこのcsvを使います。
import pandas as pd
import numpy as np
# テストデータの生成
num_rows = 50
categories = ['cat1', 'cat2', 'cat3']
titles = ['title1', 'title2', 'title3']
comments = ['good', 'bad', 'neutral']
data = {'カテゴリ': np.random.choice(categories, num_rows),
'タイトル': np.random.choice(titles, num_rows),
'コメント': np.random.choice(comments, num_rows)}
df = pd.DataFrame(data)
# 集計結果の表示
print(df.groupby(['カテゴリ', 'タイトル']).agg({'コメント': 'count'}))
# CSVファイルとしてデータを出力
df.to_csv('test_data.csv', index=False)
df = pd.read_csv("/content/sample_data/test_data.csv")
df["連続"] = df.groupby(["タイトル","カテゴリ"]).cumcount()
こんな感じになります。
| カテゴリ | タイトル | コメント | 連続 |
|---|---|---|---|
| cat2 | title3 | good | 0 |
| cat3 | title2 | good | 0 |
| cat1 | title1 | neutral | 0 |
| cat2 | title2 | bad | 0 |
| cat1 | title2 | good | 0 |
| cat1 | title3 | good | 0 |
| cat3 | title1 | neutral | 0 |
| cat1 | title2 | bad | 1 |
| cat3 | title3 | good | 0 |
| cat1 | title2 | good | 2 |
| cat1 | title3 | good | 1 |
| cat3 | title3 | good | 1 |
| cat2 | title3 | neutral | 1 |
| cat3 | title1 | bad | 1 |
| cat2 | title1 | neutral | 0 |
cumcountはgroupbyでまとめたデータで
コメントが同じものをカウントする。
カウントしたら、連続カラムに値を入れます。
カテゴリとタイトルをgroup化して、コメントが連続しているか数える。
その後に、クロス集計を行います。
[タイトル、カテゴリ]と[コメント]のクロス!
df = df.pivot_table(index=["タイトル","カテゴリ"],columns="番号",values="コメント",aggfunc="first")
.fillna().reset_index()
#aggfuncはデフォだとmeanが適用される。コメントは数値ではないため、mean以外を指定する必要がある?
#aggfuncで算出方法を指定する。firstやsumなどがある
| 連続 | タイトル | カテゴリ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | title1 | cat1 | neutral | neutral | good | good | neutral | neutral | ||||||
| 1 | title1 | cat2 | neutral | |||||||||||
| 2 | title1 | cat3 | neutral | bad | good | bad | bad | bad | good | neutral | ||||
| 3 | title2 | cat1 | good | bad | good | neutral | neutral | good | neutral | bad | neutral | neutral | neutral | good |
| 4 | title2 | cat2 | bad | good | bad | bad | bad | |||||||
| 5 | title2 | cat3 | good | good | good | neutral | bad | neutral | good | |||||
| 6 | title3 | cat1 | good | good | ||||||||||
| 7 | title3 | cat2 | good | neutral | good | good | good | neutral | neutral | |||||
| 8 | title3 | cat3 | good | good |
pivot_tableが肝
このクロス集計は表index、裏がcolumns、valuesが値。
タイトルとカテゴリをグループ化して、行見出しにする。
valueに設定したのものを横並びにする
グループ化したものが複数ある場合(今回はコメント)、columnsを連続番号としIDみたいに扱う。
グループ化したものを"横一列化"した。