こいけるの日記

データサイエンス / データエンジニアリングに興味がある若手SIer社員の日記

【Python】横持ちの時系列データを縦持ちに変換する

概要

現在参加中のKaggleのコンペで、横持ちしている時系列データを縦持ちの形に変換したうえで処理したい、というニーズがあったので、やり方をメモ。

やりたいこと

横持ちのデータ構造を持つデータフレームを、

f:id:zaohgyu:20200405145514j:plain
横持ちの時系列売り上げデータ

縦持ちに変換する。

f:id:zaohgyu:20200405152152j:plain
縦持ちの時系列売り上げデータ

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

おわり~