gpt4 book ai didi

python - 用严格的填充限制填充 Pandas 数据框

转载 作者:行者123 更新时间:2023-12-04 08:09:17 25 4
gpt4 key购买 nike

这个问题建立在旧问题的基础上:pandas ffill/bfill for specific amount of observation
给出以下答案的地方。

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
但是在我的情况下,只有当 consec nan < 限制时才应该向前填充。
为了说明我的应用程序的结果应该如下所示:
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

最佳答案

在您的情况下,您可以检查连续的 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())
)
输出:
    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

关于python - 用严格的填充限制填充 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66064517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com