Python 循环迭代,替换列表的时间序列中的空值



我需要在 Python 中用下面列表的值替换空值。 如果列表中的任何项目的值不为 null,则值将相同。

列表示例

[[1538140080000, None], [1538140140000, None], [1538140200000, None], [1538140260000, None], [1538140320000, None], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

我想让输出是

[[1538140080000, 92881926.0], [1538140140000, 92881926.0], [1538140200000, 92881926.0], [1538140260000, 92881926.0], [1538140320000, 92881926.0], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

在列表中,任何一个(键,值(都将具有所需的值(除了null(,我想将其替换为列表的所有键。

列表理解可以轻松完成这项工作

l = [[q if q else 0 for q in i] for i in l]

输出

[[1538140080000, 0], [1538140140000, 0], [1538140200000, 0], [1538140260000, 0], [1538140320000, 0], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

更新

var = [[i[q] for i in l if i[q]] for q in range(len(l[0]))]
l  = [[q if q else var[w][0] for w,q in enumerate(i)] for i in l]

输出

[[1538140080000, 92881926.0], [1538140140000, 92881926.0], [1538140200000, 92881926.0], [1538140260000, 92881926.0], [1538140320000, 92881926.0], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

如果您硬编码替换,可能是单行代码。

此外,如果可以允许延迟计算,则可以消除 list(...( 调用。

replacement = 0
l = list( map(lambda (a,b): [a,replacement if b == None else b], l) )
l = [[1538140080000, None], [1538140140000, None], [1538140200000, None], [1538140260000, None], [1538140320000, None], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]
replacement = next(filter(None, list(zip(*l))[1]))
for sl in l:
for i, x in enumerate(sl):
if x is None:
sl[i] = replacement
print(l)

输出

[[1538140080000, 92881926.0],
[1538140140000, 92881926.0],
[1538140200000, 92881926.0],
[1538140260000, 92881926.0],
[1538140320000, 92881926.0],
[1538140380000, 92881926.0],
[1538140440000, 92881926.0]]

如果您乐于使用第三方库,Pandas 提供了矢量化方法:

import pandas as pd
L = [[1538140080000, None], [1538140140000, None], [1538140200000, None],
[1538140260000, None], [1538140320000, None], [1538140380000, 92881926.0],
[1538140440000, 92881926.0]]
res = pd.DataFrame(L).bfill().ffill().values.tolist()
print(res)
[[1538140080000.0, 92881926.0], [1538140140000.0, 92881926.0], [1538140200000.0, 92881926.0],
[1538140260000.0, 92881926.0], [1538140320000.0, 92881926.0], [1538140380000.0, 92881926.0],
[1538140440000.0, 92881926.0]]

获取不None的值,因为它永远只能是一个我们可以使用的值set

l中的项目重新定义为[i[0], *value]

value = set([y for x, y in l if y != None])
l = [[i[0], *value] for i in l]
[[1538140080000, 92881926.0], [1538140140000, 92881926.0], [1538140200000, 92881926.0], [1538140260000, 92881926.0], [1538140320000, 92881926.0], [1538140380000, 92881926.0], [1538140440000, 92881926.0]]

最新更新