在Python中替换缺失值
我想把缺失的值(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]]