【问题标题】:Is there a way to replace specific value in a list with the adjacent values?有没有办法用相邻值替换列表中的特定值?
【发布时间】:2021-08-20 04:42:47
【问题描述】:

我的代码应该将缺失值更改为其有效的直接相邻值。但是,它似乎没有正确运行,我不太确定错误在哪里。

因此必须将缺失值校正为其相邻值的平均值。但是,如果存在连续的缺失值,则应使用有效的相邻值对其进行校正。仅使用基本的 Python 函数,如 for 循环和 if/else。

    data = [1, -999, -999, 3, 4]
    missing = -999
    for i, num in enumerate(data):
        if num == missing:
            if [i-1] and [i+1] != missing:
                data[i] = (data[i-1] + data[i+1]) / 2
            elif [i-1] != missing and [i+1] == missing:
                data[i] = data[i-1]
            elif [i+1] != missing and [i-1] == missing:
                data[i] = data[i+1]
            else:
                data[i] = data[i]
            print(data)

例如:

    data = [1, 2, -999, 4, 5], [1, -999, -999, 3, 4], [-999, -999, 3, 4, 5], [-999, -999, -999, -999, -999]
    expected output = [1, 2, 3, 4, 5], [1, 1, 3, 3, 4], [3, 3, 3, 4, 5], [-999, -999, -999, -999, -999]

【问题讨论】:

  • [i-1] 本身与data 列表无关。
  • 如果num == missing :里面不应该是data[i-1]data[i+1]吗?

标签: python python-3.x for-loop if-statement data-cleaning


【解决方案1】:

试试下面的代码:

data = [1, 2, 3, -999, -999]
missing = -999
for i, num in enumerate(data):
    if (num == missing) and (i not in [0, len(data) - 2, len(data) - 1]):
        if (data[i-1] != missing) and (data[i+1] != missing):
            data[i] = (data[i-1] + data[i+1]) / 2
        elif (data[i-1] != missing) and (data[i+1] == missing):
            data[i] = data[i-1]
            data[i+1] = data[i+2]
        elif (data[i+1] != missing) and (data[i-1] == missing):
            data[i] = data[i+1]
            data[i-1] = data[i-2]
    elif (num == missing) and (i == 0):
        if data[i+1] != missing:
            data[i] = data[i+1]
        else:
            data[i] = data[i+2]
    elif (num == missing) and (i in [len(data) - 2, len(data) - 1]):
        if data[i-1] != missing:
            data[i] = data[i-1]
        else:
            data[i] = data[i-2]
print(data)

输出:

[3, 3.0, 3, 4, 5]

【讨论】:

  • 哦,成功了!但是如果我的数据是 [1, 2, 3, -999, -999] 怎么办?这不适用于该数据。我必须在底部添加另一个 elif 吗?
  • 此答案将搜索有效相邻值的范围硬编码为 2。当有效相邻值超过 2 个索引时,它将中断,例如[-999, -999, -999, 3, 4].
  • @blhsing 我知道,在 OP 示例中,他拥有的最多 -999 是 2
  • @blhsing 我正在测试他的列表
  • @U12-Forward 描述说“如果有连续的缺失值,那么应该用有效的相邻值来纠正它们。”它没有提到搜索有效相邻值的范围仅限于 2。因此,您的目标不应只是满足测试用例,而应满足描述的精神。
猜你喜欢
  • 2020-10-15
  • 2020-04-13
  • 2022-08-19
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2017-04-22
  • 2015-07-28
  • 2019-09-30
相关资源
最近更新 更多