【问题标题】:Converting NaN to Integer将 NaN 转换为整数
【发布时间】:2021-12-23 08:13:02
【问题描述】:

我需要在 Python(特别是 NumPy)中将 NaN 值转换为整数,不幸的是这会引发错误。对于那些不熟悉这个问题的人,这里有一个 MWE 展示它:

import numpy as np

test_data = [[2.3, 4], [1.1, np.nan]]

test_array = np.array(test_data, dtype=[("col1", float), ("col2", int)])

运行此代码会产生错误ValueError: cannot convert float NaN to integer。之前有关于此的问题,最值得注意的是herehere,但它们只提供了在我的情况下没有用的解决方法。以下是他们给出的一些解决方案以及我想到的一些解决方案,以及它们对我不起作用的原因:

  1. 删除具有 NaN 值的行。不幸的是,我正在创建的表格的全部目的是提供一个目标列表,其中一些目标缺少某些参数中的数据,因此删除这些行会破坏创建表格的全部目的。
  2. 将 NaN 值替换为 0。不幸的是,在某些情况下,这实际上会向读者暗示一些不正确的事情。此外,我提交给的期刊要求此类空格为空白,而使用 NaN 是我所知道的在数字单元格中生成空格的唯一方法。
  3. 将相关列转换为浮点数,以便我可以毫无问题地使用 NaN。不幸的是,我遇到问题的一列指出了一个特定的(并且每行都在变化)引用,而引用 1.0 的引用听起来很奇怪。
  4. 将有问题的列转换为字符串,然后插入一个空白字符串。不幸的是,这种格式会跟踪列中的数据类型,我认为期刊会不高兴将明显的整数列为字母字符。这也适用于第 3 点。

这就是我所在的地方。我需要在一列整数中有空白条目,而我所知道的浮点数的唯一方法不同意 Python。在我的具体情况下,此类问题的其他答案中建议的各种解决方法是不可行的。那么如何通过某种方式将 NaN 转换为 int 或以其他方式插入空白 int 来使其工作?

【问题讨论】:

标签: python numpy type-conversion integer nan


【解决方案1】:

一件事是将其转换为object 类型的数组:

test_array = np.array(test_data, dtype=object)

这将保留浮点数 2.3 和 1.1,将 nan 保留为浮点数,但会将 4 转换为整数:

print(test_array)
print([type(val) for row in test_array for val in row])
> [[2.3 4]
   [1.1 nan]]
> [<class 'float'>, <class 'int'>, <class 'float'>, <class 'float'>]

如果您希望所有将数字转换为int,您可以做的一件事是转换您可以转换的数字,其余的保持原样:

array1 = np.array(test_data)

nan_indices = np.isnan(array1)

test_array = np.empty(array1.shape, dtype = object)
test_array[~nan_indices] = array1[~nan_indices].astype(int)
test_array[nan_indices] = np.nan

然后打印输出如下:

> [[2 4]
   [1 nan]]
> [<class 'int'>, <class 'int'>, <class 'int'>, <class 'float'>]

【讨论】:

    猜你喜欢
    • 2021-11-16
    • 2018-04-30
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2021-11-12
    • 2020-10-24
    相关资源
    最近更新 更多