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