如何从列表中删除 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]]
我正在尝试将一个列表扩展为一个单独的列表列表,顺序正确。但有些值是 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]]