pandasで時系列カラムの欠損行を埋める
ログデータから計測時間を元にgroupbyして集約データにするときに、 広告のクリックのように滅多に計測できないものの場合は その時間帯の行が無いことがある。
具体的にはこんな内容のデータ。
click created_at 1 1 2017-07-01 01:00:00 2 1 2017-07-01 02:00:00 3 2 2017-07-01 03:00:00 4 2 2017-07-01 04:00:00 5 2 2017-07-01 07:00:00 6 3 2017-07-01 08:00:00 7 2 2017-07-01 09:00:00 8 1 2017-07-01 10:00:00 9 1 2017-07-01 11:00:00 10 1 2017-07-01 12:00:00
5,6時の行がない。
date_range関数でSeriesオブジェクトを生成して、
indexを設定し直すことで行を埋めることができる。
事前にindexをcreated_at列に置き換えておく。
sample_log.index = sample_log.created_at start_at, end_at = sample_log.created_at.min(), sample_log.created_at.max() res = sample_log.reindex(pd.date_range(start_at, end_at, freq="H")) print("[after]\n",res.head(10))
5,6時の行が増えた。click, created_at には値はなかったので
それぞれNaN, NaTとなっている。(datetime だから Not Available Time?)
[after] click created_at 2017-07-01 01:00:00 1.0 2017-07-01 01:00:00 2017-07-01 02:00:00 1.0 2017-07-01 02:00:00 2017-07-01 03:00:00 2.0 2017-07-01 03:00:00 2017-07-01 04:00:00 2.0 2017-07-01 04:00:00 2017-07-01 05:00:00 NaN NaT 2017-07-01 06:00:00 NaN NaT 2017-07-01 07:00:00 2.0 2017-07-01 07:00:00 2017-07-01 08:00:00 3.0 2017-07-01 08:00:00 2017-07-01 09:00:00 2.0 2017-07-01 09:00:00 2017-07-01 10:00:00 1.0 2017-07-01 10:00:00
ついでにカラムの欠損を埋めるとしたら
今度は逆にindexをcreated_atに上書きする。
clickはfillna関数を使って埋める。
res.created_at = res.index res.click = res.click.fillna(0) print("[after2]\n",res.head(10))
最終結果
[after2] click created_at 2017-07-01 01:00:00 1.0 2017-07-01 01:00:00 2017-07-01 02:00:00 1.0 2017-07-01 02:00:00 2017-07-01 03:00:00 2.0 2017-07-01 03:00:00 2017-07-01 04:00:00 2.0 2017-07-01 04:00:00 2017-07-01 05:00:00 0.0 2017-07-01 05:00:00 2017-07-01 06:00:00 0.0 2017-07-01 06:00:00 2017-07-01 07:00:00 2.0 2017-07-01 07:00:00 2017-07-01 08:00:00 3.0 2017-07-01 08:00:00 2017-07-01 09:00:00 2.0 2017-07-01 09:00:00 2017-07-01 10:00:00 1.0 2017-07-01 10:00:00
参考
pandas.date_range — pandas 0.20.3 documentation