【Python】横持ちの時系列データを縦持ちに変換する
概要
現在参加中のKaggleのコンペで、横持ちしている時系列データを縦持ちの形に変換したうえで処理したい、というニーズがあったので、やり方をメモ。
やりたいこと
横持ちのデータ構造を持つデータフレームを、
縦持ちに変換する。
melt関数
使用するのはpandasのmelt関数。 詳しいパラメータの説明は上記リンクを参照してもらうこととして、今回使うパラメータは、
- id_vars → ID列として残しておく列の指定
- var_name → 縦持ちさせるカラムの列名の指定
- value_name → 縦持ちさせる値の列名の指定
の3つ。
実行例
import pandas as pd
file_path = "../data/sample_a.csv"
data_pivot = pd.read_csv(file_path)
# 変換前のデータ
data_pivot.head()
ID | Item_ID | Shop_ID | Day1 | Day2 | Day3 | |
---|---|---|---|---|---|---|
0 | itemA_shopX | itemA | shopX | 6 | 6 | 6 |
1 | itemA_shopY | itemA | shopY | 8 | 6 | 9 |
2 | itemB_shopX | itemB | shopX | 5 | 1 | 7 |
3 | itemB_shopY | itemB | shopY | 10 | 1 | 7 |
# melt関数を使って変換 data_unpivot = data_pivot.melt(id_vars=["ID", "Item_ID", "Shop_ID"], var_name="Day", value_name="Count")
# 変換後のデータ data_unpivot.head(12)
ID | Item_ID | Shop_ID | Day | Count | |
---|---|---|---|---|---|
0 | itemA_shopX | itemA | shopX | Day1 | 6 |
1 | itemA_shopY | itemA | shopY | Day1 | 8 |
2 | itemB_shopX | itemB | shopX | Day1 | 5 |
3 | itemB_shopY | itemB | shopY | Day1 | 10 |
4 | itemA_shopX | itemA | shopX | Day2 | 6 |
5 | itemA_shopY | itemA | shopY | Day2 | 6 |
6 | itemB_shopX | itemB | shopX | Day2 | 1 |
7 | itemB_shopY | itemB | shopY | Day2 | 1 |
8 | itemA_shopX | itemA | shopX | Day3 | 6 |
9 | itemA_shopY | itemA | shopY | Day3 | 9 |
10 | itemB_shopX | itemB | shopX | Day3 | 7 |
11 | itemB_shopY | itemB | shopY | Day3 | 7 |
おわり~