ysaz (ImanazaS) blog

最近はデータ分析や機械学習が中心。たまに音楽や書評。

Pandasでのデータ集計

pandasを使ったデータフレームの成形について。meltやpivot_tableの使い方に関する備忘録。

例:
都市ID毎の日別気温、湿度データが与えられているが、各列にデータがまとめられている(例えば、気温の列に全ての都市IDに紐づくデータが一纏めになっている)とき、都市ID毎の気温、湿度データを取り出し、別の列にまとめ直す。
pandasを用いた操作は、次の3つのステップで実行する。

ステップ1:meltを使って、気温、湿度データを一列(value)にまとめる。あるいは、複数列で持っている値を行持ちに展開する。
ステップ2:IDとvariable名をくっつけ、keyという列をつくる。
ステップ3:pivot_tableを使って、key列を横方向へ展開する。あるいは、複数行で持っている値を列持ちに変換する。

import pandas as pd
import datetime

# データフレームの作成
df = pd.DataFrame(data=[('2016-04-01', 'a', 10.2, 60.3), ('2016-04-02', 'a', 16.4, 71.7), ('2016-04-01', 'b', 11.1, 65.6), ('2016-04-02', 'b', 15.1, 73.2)])
df.columns = ['date', 'id', 'temp', 'humidity']
# 成形前(df)
#          date id  temp  humidity
# 0  2016-04-01  a  10.2      60.3
# 1  2016-04-02  a  16.4      71.7
# 2  2016-04-01  b  11.1      65.6
# 3  2016-04-02  b  15.1      73.2

# ステップ1
df1 = pd.melt(df, id_vars = ['date', 'id'], value_vars = ['temp', 'humidity'])

# ステップ2
df1['key'] = df1['id'].map(str) + '_' + df1['variable'].map(str)
df1 = df1.drop(['id', 'variable'], 1)
df1['date'] = pd.to_datetime(df1['date'])
# df1['date'] = [datetime.datetime.strptime(i, '%Y-%m-%d') for i in df1['date']]  少し回りくどい方法
df1.index = df1['date']

# ステップ3
df2 = df1.pivot_table(values='value',  index='date', columns='key')
# 成形後(df2)
# key          a_humidity  a_temp  b_humidity  b_temp
# date
# 2016-04-01        60.3    10.2        65.6    11.1
# 2016-04-02        71.7    16.4        73.2    15.1