在Python中替换缺失值

0 投票
6 回答
3429 浏览
提问于 2025-04-17 11:01

我想把缺失的值(None)替换成之前最近的已知值。这是我的代码。但是它不太好用。有没有什么更好的方法可以建议一下?

t = [[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]]
def treat_missing_values(table):
    for line in table:
        for value in line:
            if value == None:
                value = line[line.index(value)-1]
    return table

print treat_missing_values(t)

6 个回答

3

如果列表的开头是None,或者里面有重复的值,那么通过值来查找索引的方法就不管用了。你可以试试这个:

def treat(v):
   p = None
   r = []
   for n in v:
     p = p if n == None else n
     r.append(p)
   return r

def treat_missing_values(table):
   return [ treat(v) for v in table ]

t = [[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]]
print treat_missing_values(t)

希望这不是你的作业,兄弟。

编辑 给所有喜欢函数式编程的朋友们提供一个可用的版本:

def treat(l):
  def e(first, remainder):
     return [ first ] + ([] if len(remainder) == 0 else e(first if remainder[0] == None else remainder[0], remainder[1:]))
  return l if len(l) == 0 else e(l[0], l[1:])   
3

在Python中,当你进行赋值操作时,其实是在内存中创建了一个对象的引用。你不能用值来设置列表中的对象,因为这样做实际上是让值指向了内存中的另一个对象。

要实现你想要的效果,你需要直接在列表的正确位置进行设置。

正如所说,如果某个内部列表的第一个值是None,你的算法就无法正常工作。

所以你可以这样做:

t = [[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]]
def treat_missing_values(table, default_value):
    last_value = default_value
    for line in table:
        for index in xrange(len(line)):
            if line[index] is None:
                line[index] = last_value
            else:
                last_value = line[index]
    return table

print treat_missing_values(t, 0)
4

这大概是我会这么做的方式:

>>> def treat_missing_values(table):
...     for line in table:
...         prev = None
...         for i, value in enumerate(line):
...             if value is None:
...                 line[i] = prev
...             else:
...                 prev = value
...     return table
... 
>>> treat_missing_values([[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]])
[[1, 3, 3, 5, 5], [2, 2, 2, 3, 1], [4, 4, 2, 1, 1]]
>>> treat_missing_values([[None, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]])
[[None, 3, 3, 5, 5], [2, 2, 2, 3, 1], [4, 4, 2, 1, 1]]

撰写回答