我有一个包含几列并按日期索引的数据框。我想填补缺失值,但仅限于接下来的 x 天。这意味着如果一个缺失值与该列中之前的非缺失值的索引差异超过 x 天,则不会填充缺失值。
我用循环做了一些事情,但效率不高。有没有更好更优雅的方法呢?
我确切地说,我的索引中的日期不是等距的,所以 limit 参数不起作用。
我有一个包含几列并按日期索引的数据框。我想填补缺失值,但仅限于接下来的 x 天。这意味着如果一个缺失值与该列中之前的非缺失值的索引差异超过 x 天,则不会填充缺失值。
我用循环做了一些事情,但效率不高。有没有更好更优雅的方法呢?
我确切地说,我的索引中的日期不是等距的,所以 limit 参数不起作用。
这说明了我的意思
In [20]: df = DataFrame(randn(10,2),columns=list('AB'),index=date_range('20130101',periods=3)+date_range('20130110',periods=3)+date_range('20130120',periods=4))
In [21]: df
Out[21]:
A B
2013-01-01 -0.176354 1.033962
2013-01-02 0.666911 -0.018723
2013-01-03 0.300097 1.552866
2013-01-10 0.581816 -1.188106
2013-01-11 -0.394817 -1.018765
2013-01-12 1.000461 -1.211131
2013-01-20 0.097940 1.225805
2013-01-21 -2.205975 -0.455641
2013-01-22 0.508865 -0.403321
2013-01-23 -0.726969 0.448002
In [22]: df.reindex(index=date_range('20130101','20130125')).fillna(limit=2,method='pad')
Out[22]:
A B
2013-01-01 -0.176354 1.033962
2013-01-02 0.666911 -0.018723
2013-01-03 0.300097 1.552866
2013-01-04 0.300097 1.552866
2013-01-05 0.300097 1.552866
2013-01-06 NaN NaN
2013-01-07 NaN NaN
2013-01-08 NaN NaN
2013-01-09 NaN NaN
2013-01-10 0.581816 -1.188106
2013-01-11 -0.394817 -1.018765
2013-01-12 1.000461 -1.211131
2013-01-13 1.000461 -1.211131
2013-01-14 1.000461 -1.211131
2013-01-15 NaN NaN
2013-01-16 NaN NaN
2013-01-17 NaN NaN
2013-01-18 NaN NaN
2013-01-19 NaN NaN
2013-01-20 0.097940 1.225805
2013-01-21 -2.205975 -0.455641
2013-01-22 0.508865 -0.403321
2013-01-23 -0.726969 0.448002
2013-01-24 -0.726969 0.448002
2013-01-25 -0.726969 0.448002
我通过实现一个可以为 Series 完成工作的 cython 函数解决了这个问题。我只是在我的数据框的每一列上调用这个函数来做到这一点。
按照 Onyxx 的回答,我解决了同样的问题,如下所示:
其实我只是想到了解决办法。这将需要 3 行代码:
1/ 将数据帧重新采样到第二个 2/ fillna 限制 3/ 用原始数据帧的索引重新索引我的新数据帧
就速度而言,我不知道它的外观,但我认为应该没问题,因为大多数熊猫功能都是在 cython 中实现的