【问题标题】:Keep only numerical information from numpy array of strings仅保留来自 numpy 字符串数组的数字信息
【发布时间】:2022-01-21 16:43:38
【问题描述】:

我只想保留 numpy 字符串数组中的数字,这些数字不一定有效。我的代码如下所示:

age = train['age'].to_numpy() # 200k values
set(age)
# {'1', '2', '3', '7-11', np.nan...} 

age  = np.array(['1', '2', '3', '7-11', np.nan])

期望的输出: np.array([1, 2, 3])。理想情况下,'7-11' 应该是 7,但是,这并不简单,而且是可以容忍的损失。

np.isfinite(x) 给出“输入类型不支持 ufunc 'isfinite',并且根据强制转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型” /p>

x = [num for num in age if isinstance(num, (int, float))] 返回[]

【问题讨论】:

  • 这实质上是对以下问题stackoverflow.com/q/11620914/5728614的后续处理
  • 请提供所需的输出,我假设它是一个只有 [1, 2] 的数组?应该返回任何整数和浮点数,但是作为数字的字符串呢,例如'1'。是否应该将其作为整数类型包含在内?关于边缘情况等的更多上下文会有所帮助
  • 这个SO answer 可能有用吗?如果您将不得不评估x,如图所示,混合类型包括字符串,那么输出x数组将都是字符串,您可以使用isnumeric过滤数组中的数字,see docs
  • @frederick-douglas-pearce 我进行了大量编辑并更正了数据类型。我尝试了您链接的答案的解决方案之一。我会试试isnumeric

标签: python numpy


【解决方案1】:

这里有一个选项会先在'-'上分割字符串,并且只取第一个值,所以'7-11'被转换为7:

age = np.array(['1', '2', '3', '7-11', np.nan])
age_int = np.array([int(x[0]) for x in np.char.split(age, sep='-') if x[0].isdecimal()])

输出:array([1, 2, 3, 7])

如果您不关心“7-11”之类的情况,还有一种更有效的方法:

age_int2 = age[np.char.isdecimal(age)].astype(int)

输出2:array([1, 2, 3])

【讨论】:

    【解决方案2】:

    您可以执行以下操作

    for pos, val in enumerate(age):
        try:
            new_val = int(val)
        except:
            new_val = np.nan
        age[pos] = new_val
    
    age = age[age!="nan"].astype(int)
    
    print(age)
    > array([1, 2, 3])
    

    【讨论】:

    • 经过我编辑的小改动后,这段代码解决了我的问题。谢谢!我要等几天才能接受这个,以防有一个不错的单线或“更好”的解决方案。
    • @frederick-douglas-pearce 有一个很棒的单线!
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 2021-09-17
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多