我有一个包含多个列的数据框,并按日期编制索引。我想填补缺失的值,但仅限于接下来的x天。这意味着如果索引中的差异大于x天且该列中先前的非缺失值,则不会填充缺失值。
我用循环做了一些事情,但效率不高。是否有更好,更优雅的方式呢?
我确切地说我的索引中的日期不是等间隔,所以limit参数不起作用。
答案 0 :(得分:5)
您可以使用fillna
的limit
参数:
df.fillna(method='ffill', limit=3) # ffill is equivalent to pad
ffill
,bfill
便利功能可以使用相同的参数。
limit : int
,默认None
向前或向后填充的最大尺寸间隙
如果您的日期间隔不均匀,您可以先resample
(按天):
df.resample('D')
另请参阅文档的missing data部分。
答案 1 :(得分:1)
这说明了我的意思
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
答案 2 :(得分:0)
其实我只是考虑过这个解决方案。它需要3行代码:
1 /将数据帧重新采样到第二个 2 / fillna有限制 3 /使用原始数据的索引重新索引我的新数据框
就速度而言,我不会看起来如何,但应该没问题我认为大多数pandas功能是在cython中实现的
答案 3 :(得分:0)
在Onyxx的回答中,我解决了同样的问题:
答案 4 :(得分:0)
我通过实现一个可以完成系列工作的cython函数来解决这个问题。我只是在我的数据帧的每一列上调用此函数来执行此操作。