我有一个列表列表,如果其中的1个列表充满了nans,那么其中的一个就是列表。
l_of_l=[[1,2,3],[nan,nan,nan],[3,4,5]]
我想用nans替换l_of_l的列表为零:
所需的输出是
l_of_l=[[1,2,3],[0,0,0],[3,4,5]]
这是我的代码:
for list1 in l_of_l:
if all(np.isnan(list1)) == True:
list1 = [0] * len(list1)
但是我不确定如何将结果再次分配给l_of_l而不需要生成新的列表列表
答案 0 :(得分:1)
您可以使用以下列表理解:
import numpy as np
[[0 if np.isnan(j) else j for j in i] for i in l_of_l]
# [[1, 2, 3], [0, 0, 0], [3, 4, 5]]
如果您希望避免导入numpy
,尽管数据表明您应该使用它,则实际上可以执行以下操作:
[[0 if j!=j else j for j in i] for i in l_of_l]
# [[1, 2, 3], [0, 0, 0], [3, 4, 5]]
根据定义,这NaNs
永远不等于自己
或直接构建numpy
数组并使用nan_to_num
:
np.nan_to_num(np.array(l_of_l))
array([[1., 2., 3.],
[0., 0., 0.],
[3., 4., 5.]])
答案 1 :(得分:0)
由于您仍在使用numpy
,因此可以使用numpy.nan_to_num
import numpy as np
l_of_l= np.array([[1, 2, 3],[np.nan, np.nan, np.nan], [3, 4, 5]])
print(np.nan_to_num(l_of_l))
打印
[[1. 2. 3.]
[0. 0. 0.]
[3. 4. 5.]]
答案 2 :(得分:0)
您可以按索引迭代列表的列表,这样就不必生成新列表,只需在索引上对其进行更新:
for i, lst in enumerate(l_of_l):
if all(np.isnan(lst)) == True:
l_of_l[i] = [0] * len(lst)
答案 3 :(得分:0)
通过单个np.num_to_nan
通话:
import numpy as np
l_of_l = np.array([[1,2,3],[np.nan, np.nan, np.nan],[3,4,5]])
np.nan_to_num(l_of_l, copy=False)
print(l_of_l)
输出:
[1. 2. 3.]
[0. 0. 0.]
[3. 4. 5.]]
答案 4 :(得分:0)
您可以尝试以下方法:
import numpy as np
l_of_l=[[1,2,3],[np.NaN,np.NaN,np.NaN],[3,4,5]]
final_l_of_l = []
for listt in l_of_l:
my_list = []
my_list = [0 if np.isnan(n) else n for n in listt]
final_l_of_l.append(my_list)
final_l_of_l
输出:
[[1, 2, 3], [0, 0, 0], [3, 4, 5]]