简体   繁体   English

使用严格的填充限制填充 pandas dataframe

[英]ffill pandas dataframe with a strict fill limit

This questions builds upon the old question: pandas ffill/bfill for specific amount of observation这个问题建立在旧问题的基础上: pandas ffill/bfill 用于特定的观察量

Where the following answer is given.给出以下答案的地方。

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

However in my case only when the number of consec nan < limit it should forward fill.但是在我的情况下,只有当 consec nan < limit 的数量才应该向前填充。 To illustrate the result for my application should look like:为了说明我的应用程序的结果应该如下所示:

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     NaN
4    1        NaN     NaN
5    1        NaN     NaN
6    1        NaN     NaN
7    1        NaN     NaN
8    1        4.0     4.0
9    1        NaN     NaN
10   1        NaN     NaN
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     NaN
17   2        NaN     NaN
18   2        NaN     NaN
19   2        5.0     5.0
20   2        NaN     5.0
21   3        3.0     3.0
22   3        NaN     NaN
23   3        NaN     NaN
24   3        NaN     NaN
25   3        NaN     NaN

In your case, you can check the consecutive NaN blocks and mask the filled column:在您的情况下,您可以检查连续的NaN块并屏蔽填充的列:

forward=2

# we groupby on `.notna().cumsum()` to find block sizes
# then compare to number of forward limit
valid_blocks = (df.groupby([df['indicator'].notna().cumsum(), 'id'])
                  ['id'].transform('size') <= forward
               )

# ffill as usual, then mask those invalid with `NaN`
df['filled'] = (df.groupby("id")["indicator"].ffill(limit=forward)
                  .where(valid_blocks | df['indicator'].notna())
               )  

Output: Output:

    id  indicator  filled
0    1        NaN     NaN
1    1        NaN     NaN
2    1        1.0     1.0
3    1        NaN     NaN
4    1        NaN     NaN
5    1        NaN     NaN
6    1        NaN     NaN
7    1        NaN     NaN
8    1        4.0     4.0
9    1        NaN     NaN
10   1        NaN     NaN
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     NaN
17   2        NaN     NaN
18   2        NaN     NaN
19   2        5.0     5.0
20   2        NaN     5.0
21   3        3.0     3.0
22   3        NaN     NaN
23   3        NaN     NaN
24   3        NaN     NaN
25   3        NaN     NaN

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM