pandas ffill/bfill 用于特定观察量

fre*_*888 3 python pandas

我有以下数据框:

 id     indicator 
 1          NaN
 1          NaN
 1          1
 1          NaN
 1          NaN
 1          NaN
Run Code Online (Sandbox Code Playgroud)

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

 id     indicator 
 1          NaN
 1          NaN 
 1          1
 1          1
 1          1
 1          NaN
Run Code Online (Sandbox Code Playgroud)

我知道命令

df.groupby("id")["indicator"].fillna(value=None, method="ffill")         
Run Code Online (Sandbox Code Playgroud)

但是,这会填充所有缺失值,而不仅仅是接下来的两个观察值。有谁知道解决方案?

jez*_*ael 5

我认为DataFrameGroupBy.ffillDataFrameGroupBy.bfilllimit参数更好:

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

df.groupby("id")["indicator"].bfill(limit=3)
Run Code Online (Sandbox Code Playgroud)

样本:

#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
Run Code Online (Sandbox Code Playgroud)