fillna:如何在接下来的x天内填充值

时间:2013-06-11 06:00:36

标签: pandas

我有一个包含多个列的数据框,并按日期编制索引。我想填补缺失的值,但仅限于接下来的x天。这意味着如果索引中的差异大于x天且该列中先前的非缺失值,则不会填充缺失值。

我用循环做了一些事情,但效率不高。是否有更好,更优雅的方式呢?

我确切地说我的索引中的日期不是等间隔,所以limit参数不起作用。

5 个答案:

答案 0 :(得分:5)

您可以使用fillnalimit参数:

df.fillna(method='ffill', limit=3)  # ffill is equivalent to pad

ffillbfill便利功能可以使用相同的参数。

  

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的回答中,我解决了同样的问题:

  1. 在索引日期的数据框中添加一列,设置为nan,其中要填充的数据为nan。
  2. 填写索引日期列和数据
  3. 设置回填索引日期过旧的区域。

答案 4 :(得分:0)

我通过实现一个可以完成系列工作的cython函数来解决这个问题。我只是在我的数据帧的每一列上调用此函数来执行此操作。