データベースから抽出したデータではなく、そこからある列を軸にデータをサマリたものを分析のローデータとして使いたい場合、私はpivot_table機能を使ったうえで、csvに出力と再読み込みをしている。
データの例
下記のようなデータセットを想定する。
受注番号 | 商品番号 | 受注数 |
---|---|---|
1111 | A01 | 2 |
1111 | A02 | 3 |
1111 | A03 | 1 |
2222 | A01 | 1 |
2222 | A02 | 4 |
上記のデータを、受注番号が1列目、商品番号を列名に持つテーブルに整形したい。
整形した後のテーブル
A01 A02 A03
1111 2 3 1
2222 1 4 0
プログラミング
下記が筆者のプログラミング。改善点をぜひ指摘してください……。
qiita.rb
import pandas as pd
from pandas import Series, DataFrame
raw_data = pd.read_csv('url.csv')
# ピボットテーブル形式でまとめる
df = raw_data.pivot_table(values = ['受注数'], index = '受注番号', columns = '商品番号',aggfunc = 'sum')
# NaNを0に置き換える
df = df.fillna(0)
# csvに出力
df.to_csv('url_2')
# 出力したcsvを読込
df2 = pd.DataFrame(pd.read_csv('url_2'))
## 列名を整える(最初の列名は受注番号、それ以降はカテゴリ名が来るようにする)
# カテゴリ名を取得
titles = list(df2.iloc[0,1:])
# 最初の列名を”受注番号”にする
titles.insert(0,'受注番号')
# 列名を変更
df2.columns = titles
## 最初の2行を削除(不要なので)
df2 = df2.drop(df2.index[[0,1]])
pivot_tableを使ってcsvへ出力→再入力という手間をかけなくても、groupbyとかでスマートにできないか、と思うのだけれど、イマイチ妙案が浮かばない…。