在非零数值之间填充零,保留其他零

4
我需要在数据框列中填充零,如标题所述。虽然可以使用iterrows()或itertuples()(执行时间相似)和一些条件语句来完成此操作,但我希望有更快的方法。
有一些连续的、相同的整数,它们之间有时候有一个或两个零。这些是我需要用它们之间的整数来填充的零。所有其他的零(不在非零整数之间的零,也可以说是连续两个以上的零)仍然保留为零。
x = [[0,0,0,0,0,2,2,2,0,2,2,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,0],
     [0,0,0,0,3,3,0,0,3,3,3,3,0,0,0,0,0,2,2,2,0,2,2,0,0,0,0,0,0,0],
     [0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0]]
df = pd.DataFrame.from_records(x).T
df.columns = ['x', 'y', 'z']

    x   y   z
0   0   0   0
1   0   0   0
2   0   0   0
3   0   0   0
4   0   3   0
5   2   3   0
6   2   0   0
7   2   0   0
8   0   3   0
9   2   3   1
10  2   3   1
11  0   3   1
12  0   0   0
13  0   0   0
14  0   0   1
15  0   0   1
16  0   0   1
17  0   2   0
18  0   2   1
19  1   2   1
20  1   0   1
21  1   2   0
22  0   2   0
23  0   0   0
24  1   0   0
25  1   0   0
26  0   0   0
27  0   0   0
28  0   0   0
29  0   0   0

期望输出应为:
    x   y   z
0   0   0   0
1   0   0   0
2   0   0   0
3   0   0   0
4   0   3   0
5   2   3   0
6   2   3   0
7   2   3   0
8   2   3   0
9   2   3   1
10  2   3   1
11  0   3   1
12  0   0   1
13  0   0   1
14  0   0   1
15  0   0   1
16  0   0   1
17  0   2   1
18  0   2   1
19  1   2   1
20  1   2   1
21  1   2   0
22  1   2   0
23  1   0   0
24  1   0   0
25  1   0   0
26  0   0   0
27  0   0   0
28  0   0   0
29  0   0   0

让我们看看你到目前为止尝试了什么。 - ThePyGuy
我怀疑没有更快的方法;你必须在行之间进行检查,因此它几乎要求使用滚动缓冲区,其长度为您的最大间隙长度。 - Joffan
这个解决方案不是我自己的,我在这台机器上也没有它,但它是一个冗长的条件语句,我将其简化为基本上是 if (iloc[x] != 0) & (iloc[x] == iloc[x+2]): iloc[x+1] = iloc[x],还有一个类似的第二个 if 语句,它查看 iloc[x+3] 并填充 iloc[x+1] 和 iloc[x+2]。 - Dr Dro
1个回答

7

你可以首先将0替换为np.nan,使用ffillbfill函数并比较它们是否相等,然后保留ffilled的数据框并将0分配给其余部分:

u = df.replace(0,np.nan)
a = u.ffill()
b = u.bfill()
yourout = a.where(a==b,0).astype(df.dtypes)

print(yourout)

    x  y  z
0   0  0  0
1   0  0  0
2   0  0  0
3   0  0  0
4   0  3  0
5   2  3  0
6   2  3  0
7   2  3  0
8   2  3  0
9   2  3  1
10  2  3  1
11  0  3  1
12  0  0  1
13  0  0  1
14  0  0  1
15  0  0  1
16  0  0  1
17  0  2  1
18  0  2  1
19  1  2  1
20  1  2  1
21  1  2  0
22  1  2  0
23  1  0  0
24  1  0  0
25  1  0  0
26  0  0  0
27  0  0  0
28  0  0  0
29  0  0  0

1
很棒的答案和聪明的逻辑。 - Shubham Sharma
2
这是一个非常出色和整洁的答案。我还要感谢 @ShubhamSharma 的回答,它超出了我的想象,让我重新审视了掩码,累加和,并让我熟悉了那些不太流行的函数,并将它们加入到我的工具箱中。 - Dr Dro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接