如何从列表中删除 Nan's 并扩展到列表列表

How to remove Nan's from a list and extend to a list of lists

我正在尝试将一个列表扩展为一个单独的列表列表,顺序正确。但有些值是 Nan 的。当我这样做时,我得到一个错误 ValueError: could not convert string to float:。遍历删除 Nan 的列表然后扩展到列表会更有效吗?

数据集和代码示例如下:

数据:

X    Y
5    6
Nan  Nan
10   5
Nan  Nan
8    2

n=0
for column in data :
    if n == 0 :
        n+=1
        continue
    visuals[0].extend([float(column[0])])
    visuals[1].extend([float(column[1])])

根据@Mahesh Karia 代码后的评论进行后续。虚拟数据工作正常,但我的数据集 returns 为空列表。下面提供了两者的示例:

data_1 = [['Nan', 5, 'Nan', 10, 'Nan', 8],
        ['Nan', 6, 'Nan', 5, 'Nan', 2]]

data_2 = [[nan, -5891.3764, -5901.0081390000005, -5939.977304, -5921.11797],
        [nan, 3339.025337, 3346.9211149999996, 3356.405148, 3412.836335]]

所以 data_1 有效但 data_2 returns 是一个空列表?

一个更通用的解决方案是将 float 转换包装在 try/except 块中:

for column in data:
    ...
    try:
        visuals[0].extend([float(column[0])])
    except ValueError:
        pass

我将通过删除所有 nan 值的列表推导来执行此操作。

data = ['1', '2', "nan", '4']
[float(datum) for datum in data if datum != "nan"]

这很容易扩展到列表列表。

data = [['1', '2', 'nan', '4'], ['5', '6', 'nan']]
[[float(bar) for bar in foo if bar != "nan"] for foo in data]

当然假设您只需要捕获一个字符串值。如果有多个,您可能需要考虑执行自定义处理的函数或 try 语句。

def is_number(s):
    try:
        if str(s).lower() != "nan":
            float(s)
            return True
    except ValueError:
        pass
    return False


data_2 = [['nan', -5891.3764, -5901.0081390000005, -5939.977304, -5921.11797],
        ['nan', 3339.025337, 3346.9211149999996, 3356.405148, 3412.836335]]

visuals = [[],[]]

visuals[0].extend([float(_) for _ in data_2[0] if is_number(_)])
visuals[1].extend([float(_) for _ in data_2[1] if is_number(_)])

print visuals

输出:

[[-5891.3764, -5901.0081390000005, -5939.977304, -5921.11797], [3339.025337, 3346.9211149999996, 3356.405148, 3412.836335]]