LoginSignup
1
1

More than 1 year has passed since last update.

pandasでpivot_tableを用いて、クロス集計とかやってみた

Posted at

##クロス集計とは:
項目を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みたいに扱う。
グループ化したものを"横一列化"した。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1