Python 在非零值之间填充零,保留其他零
我需要在dataframe列中填充零,如标题中所述,我可以使用iterrows()或itertuples()(类似的执行时间)和一些条件来完成,但我希望有一种更快的方法 有些连续的、相同的整数之间有时有一个或两个零。这些是我需要用它们分开的整数填充的零。所有其他零(不在非零整数之间,因此您也可以说一行中有两个以上的零)保持为零Python 在非零值之间填充零,保留其他零,python,pandas,dataframe,Python,Pandas,Dataframe,我需要在dataframe列中填充零,如标题中所述,我可以使用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
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
您可以首先将0替换为
np.nan
,ffill
和bfill
并比较它们是否相等,然后保留ffilled
df并将0分配给其他人:
u = df.replace(0,np.nan)
a = u.ffill()
b = u.bfill()
yourout = a.where(a==b,0).astype(df.dtypes)
让我们看看你到目前为止做了什么……我怀疑有没有更快的办法;你必须检查行与行之间的距离,这样它几乎需要一个滚动缓冲区,不管你的最大间隙长度是多少。这个解决方案不是我的,我在这台机器上也没有,但这是一个很长的条件,我基本上可以分为if(iloc[x]!=0)&(iloc[x]==iloc[x+2]):iloc[x+1]=iloc[x]和一个类似的秒,如果这是在iloc上[x+3]并填充iloc[x+1]和iloc[x+2]伟大的答案和聪明的逻辑。@ShubhamSharma谢谢:-)这是一个伟大而简洁的答案。我还要感谢@ShubhamSharma你的回答,你的回答超出了我所能想到的范围,让我重新审视了面具和Cumsum,并说服我熟悉那些不受欢迎的函数,并将它们放入我的工具箱。
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