【发布时间】:2017-06-28 15:12:22
【问题描述】:
我有一个看起来像的 DF
df=pd.DataFrame.from_items([('i', [1, 1, 2,2]), ('j', [3, 3, 3,3]), ('t', [20170101, 20170115, 20170108,20170129]), ('x', [1.2, 1.4, 8,8.3])])
或
>>> df
i j t x
0 1 3 20170101 1.2
1 1 3 20170115 1.4
2 2 3 20170108 8.0
3 2 3 20170129 8.3
列 i 和 j 标识数据的一个维度(想想人物和地点),而 t 表示 i,j 的另一个维度(时间)。时间频率为每周 Y、M、D 格式。 x 列是数据(也可能有 y 列包含其他数据等)。
我需要做的是为每个 i,j 填写缺失的日期,但要根据 DF 中的内容允许不同的开始和结束时间。在本例中,1,3 缺少 20170108,2,3 缺少 20170115 和 20170122。所以填充的 DF 应如下所示:
>>> df
i j t x
0 1 3 20170101 1.2
1 1 3 20170108 N/A
2 1 3 20170115 1.4
3 2 3 20170108 8.0
4 2 3 20170115 N/A
5 2 3 20170122 N/A
6 2 3 20170129 8.3
实际上,更好的方法是将 N/A 替换为周围观察的平均值,或者只是将最后观察到的 x 结转。后一种情况是这样的
>>> df
i j t x
0 1 3 20170101 1.2
1 1 3 20170108 1.2
2 1 3 20170115 1.4
3 2 3 20170108 8.0
4 2 3 20170115 8.0
5 2 3 20170122 8.0
6 2 3 20170129 8.3
这似乎是一个更复杂的 pd.resample 版本,但我不知道如何仅在观察到的基于 i,j 不同的端点之间进行填充。实际的 DF 非常大(数百万行)。
numpy 中的解决方案也很棒。
更新:以下 Scott 的解决方案效果很好。但是,在 2000 万个 obs 的样本数据集中,df 需要 30 多分钟才能扩展到 3000 万行以进行第一次索引重置。
【问题讨论】:
标签: python pandas numpy dataframe panel