【问题标题】:Replacing empty or missing values with zeros in a large array用大数组中的零替换空值或缺失值
【发布时间】:2019-02-20 01:56:34
【问题描述】:

我有一个包含 40000 多个元素的大型数组

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

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

然后我会使用将数组中的元素转换为整数

a = map(int, a)

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

a_mean = np.mean(a)

我的问题是我无法转换为缺少数字的数组中的整数以获得平均值。

【问题讨论】:

  • 你能做到:new_a = [int(v or 0) for v in a],然后使用new_a吗?
  • 我相信你可以使用numpy.nan_to_num ?

标签: python arrays numpy replace int


【解决方案1】:

如果我理解正确的话,它应该是这样的:

for index in range(len(a)):
    if a[i] is '':
       a[i] = '0'

你也可以使用:

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

【讨论】:

    【解决方案2】:

    更详细的答案是:

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

    【讨论】:

      【解决方案3】:

      从之前的 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.]])
      

      【讨论】:

        【解决方案4】:

        您可以创建一个小函数,将单个值完全转换为您想要的方式,例如:

        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])
        

        【讨论】:

        • 谢谢,这是解决我问题的简单而干净的方法。
        猜你喜欢
        • 2021-10-22
        • 2011-12-05
        • 2019-08-15
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多