如何替换pandas中一些非零值之间的零值?

How to replace zero values in between some non-zero values in pandas?

我有一个包含传感器数据的数据框。传感器数据有波动。我想尽量减少这些波动,使其适合进一步分析。

我的数据样本如下:

    0
------
0   5
1   5
2   0
3   5
4   5
5   0
6   0
7   0
8   0
9   0
10  1
11  1
12  0
13  1
14  1
15  0
16  3
17  3
18  3
19  0
20  0
21  0
22  0

非零值之间的零值是波动的结果。我希望将这些介于非零值之间的零值替换为相邻的非零值。这不应影响传感器数据列中存在的尾随零值和前导零值。

我想要的输出应该如下所示:

    0
------
0   5
1   5
2   5 <---
3   5
4   5
5   0
6   0
7   0
8   0
9   0
10  1
11  1
12  1 <---
13  1
14  1
15  1 <---
16  3
17  3
18  3
19  0
20  0
21  0
22  0

箭头表示我需要的更换件。最好的方法是什么?

0替换为缺失值,然后用limit参数前向填充缺失值,但仅针对前向和后向填充值没有缺失值的行:

s = df[0].replace(0, np.nan)
ff = s.ffill(limit=1)
bf = s.bfill(limit=1)

df['new'] = np.where(ff.notna() & bf.notna(), ff, 0).astype(int)
print (df)
    0  new
0   5    5
1   5    5
2   0    5
3   5    5
4   5    5
5   0    0
6   0    0
7   0    0
8   0    0
9   0    0
10  1    1
11  1    1
12  0    1
13  1    1
14  1    1
15  0    1
16  3    3
17  3    3
18  3    3
19  0    0
20  0    0
21  0    0
22  0    0

第一种方法

步骤:

  1. 将列转换为列表。
  2. 遍历 list ,如果值为 0,则检查每个索引,如果是,则使当前索引值与上一个相同,否则遍历下一个。
  3. 将新列表作为数据框中的一列。

第二种方法

在dataframe中使用ffill()方法,如果当前值为0则复制之前的值