6

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

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

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

4

5 回答 5

6

您可以使用以下limit参数fillna

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

ffill,bfill便利函数也可以使用相同的参数。

limit : int, defaultNone
       向前或向后填充的最大尺寸间隙

如果您的日期间隔不均匀,您可以resample(按天)首先:

df.resample('D')

另请参阅文档的缺失数据部分。

于 2013-06-11T09:38:10.663 回答
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
于 2013-06-11T12:13:03.217 回答
0

我通过实现一个可以为 Series 完成工作的 cython 函数解决了这个问题。我只是在我的数据框的每一列上调用这个函数来做到这一点。

于 2014-06-05T14:45:18.717 回答
0

按照 Onyxx 的回答,我解决了同样的问题,如下所示:

  1. 为索引日期的数据框添加一列,设置为nan,其中要填充的数据为nan。
  2. 填写索引日期列和数据
  3. 在回填索引日期太旧的地方设置 nans。
于 2014-06-04T10:24:48.120 回答
0

其实我只是想到了解决办法。这将需要 3 行代码:

1/ 将数据帧重新采样到第二个 2/ fillna 限制 3/ 用原始数据帧的索引重新索引我的新数据帧

就速度而言,我不知道它的外观,但我认为应该没问题,因为大多数熊猫功能都是在 cython 中实现的

于 2013-06-11T13:48:19.887 回答