pandas ffill / bfill用于特定的观察量

时间:2017-07-27 06:42:40

标签: python pandas

我有以下数据框:

 id     indicator 
 1          NaN
 1          NaN
 1          1
 1          NaN
 1          NaN
 1          NaN

实际上,我还有几个ID。我现在的问题是,如何针对特定范围进行向前或向后填充,例如仅用于下一个/最后2个观察。我的数据框应如下所示:

 id     indicator 
 1          NaN
 1          NaN 
 1          1
 1          1
 1          1
 1          NaN

我知道命令

df.groupby("id")["indicator"].fillna(value=None, method="ffill")         

然而,这填补了所有缺失的值,而不仅仅是接下来的两个观察值。有人知道解决方案吗?

2 个答案:

答案 0 :(得分:3)

我认为DataFrameGroupBy.ffillDataFrameGroupBy.bfill limit参数更好:

df.groupby("id")["indicator"].ffill(limit=3)

df.groupby("id")["indicator"].bfill(limit=3)

样品:

#5 value is in the end of group, so only one value is filled 
df['filled'] = df.groupby("id")["indicator"].ffill(limit=2)
print (df)
    id  indicator  filled
0    1        NaN     NaN
1    1        NaN     NaN
2    1        1.0     1.0
3    1        NaN     1.0
4    1        NaN     1.0
5    1        NaN     NaN
6    1        NaN     NaN
7    1        NaN     NaN
8    1        4.0     4.0
9    1        NaN     4.0
10   1        NaN     4.0
11   1        NaN     NaN
12   1        NaN     NaN
13   2        NaN     NaN
14   2        NaN     NaN
15   2        1.0     1.0
16   2        NaN     1.0
17   2        NaN     1.0
18   2        NaN     NaN
19   2        5.0     5.0
20   2        NaN     5.0
21   3        3.0     3.0
22   3        NaN     3.0
23   3        NaN     3.0
24   3        NaN     NaN
25   3        NaN     NaN

答案 1 :(得分:2)

几乎在那里, 直接来自doc

  

如果指定了method,则这是向前/向后填充的连续NaN值的最大数量。换句话说,如果存在超过此数量的连续NaN的间隙,则仅部分填充。如果未指定method,则这是沿整个轴填充NaN的最大条目数。如果不是None,则必须大于0.

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num
FROM events
WHERE CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) = 27