我有以下数据框:
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")
然而,这填补了所有缺失的值,而不仅仅是接下来的两个观察值。有人知道解决方案吗?
答案 0 :(得分:3)
我认为DataFrameGroupBy.ffill
或DataFrameGroupBy.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)
如果指定了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