【问题标题】:How to replace zero values in between some non-zero values in pandas?如何替换熊猫中一些非零值之间的零值?
【发布时间】:2022-01-25 14:57:23
【问题描述】:

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

我的数据示例如下:

    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

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

【问题讨论】:

    标签: python-3.x pandas replace zero


    【解决方案1】:

    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
    

    【讨论】:

    • 它有效。非常感谢您的回复@jezrael
    【解决方案2】:

    第一种方法

    步骤:

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

    第二种方法

    在数据框中使用 ffill() 方法,如果当前值为 0,则复制前一个值。

    【讨论】:

    • ffill() 方法工作正常。如果需要,我也会尝试第一种方法。感谢您的回复。 @Saksham
    猜你喜欢
    • 2016-01-20
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多