在一个大数组中将空值或缺失值替换为零

3

我有一个超过40000个元素的大型数组。

a = ['15', '12', '', 18909, ...., '8989', '', '90789', '8']

我正在寻找一种简单的方法来将空的''值替换为'0',以便我可以使用Numpy操纵数组中的数据。

然后,我会使用以下方法将数组中的元素转换为整数:

a = map(int, a)

这样我就可以在numpy中找到数组的平均值。

a_mean = np.mean(a)

我的问题是,我无法将一个带有缺失数字的数组转换为整数以得到平均值。


4
可以。这段代码意为将列表 a 中的每个元素转化为整数,如果某个元素无法转化,就将其视作零。转化后的结果将存储在新列表 new_a 中,您可以使用它来进行后续操作。 - undefined
我相信你可以使用 numpy.nan_to_num - undefined
4个回答

5
你可以编写一个小函数,将单个值转换为你想要的格式,例如:
def to_int(x):
    try:
        return int(x)
    except ValueError:
        return 0

可以与 map 一起使用:

In [22]: a = ['15', '12', '', 18909, '8989', '90789', '8']

map(to_int, a)
Out[23]: [15, 12, 0, 18909, 8989, 90789, 8]

在列表推导式中:
In [25]: np.array([to_int(x) for x in a])
Out[25]: array([   15,    12,     0, 18909,  8989, 90789,     8])

或者在生成器表达式中直接创建numpy数组:

In [27]: np.fromiter((to_int(x) for x in a), dtype=int)
Out[27]: array([   15,    12,     0, 18909,  8989, 90789,     8])

谢谢,这是我问题的简单而干净的解决方案。 - undefined

2
如果我理解正确,它应该是这样的:
for index in range(len(a)):
    if a[i] is '':
       a[i] = '0'

您也可以使用:

a = list(map(lambda x: '0' if x == '' else x, a))

1
从之前在SO上的学习中,我看到你可以使用下面的解决方案将NaN转换为零。
from numpy import *

a = array([[0, 1, 2], [3, 4, NaN]])
where_are_NaNs = isnan(a)
a[where_are_NaNs] = 0

其次,正如我在评论中所说的那样,nan_to_num() 是与编程相关的函数。
>>> import numpy as np
>>> a = array([[0, 1, 2], [3, 4, np.NaN]])
>>> a
array([[  0.,   1.,   2.],
       [  3.,   4.,  nan]])
>>> a = np.nan_to_num(a)
>>> a
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  0.]])

0

一种更冗长的答案是:

acc = 0
for v in a:
    acc+=int(v or 0)
a_mean = acc/len(a)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接