如何解决 - TypeError: 无法安全地将非等价的 float64 转换为 int64?

Los*_*oul 19 python pandas

我正在尝试将 DF 中的一些浮点列转换为 int,但出现上述错误。我尝试过将其转换以及 fillna 为 0(我不喜欢这样做,因为在我的数据集中需要 NA)。

我究竟做错了什么?我都尝试过:

orginalData[NumericColumns] = orginalData[NumericColumns].astype('Int64')
#orginalData[NumericColumns] = orginalData[NumericColumns].fillna(0).astype('Int64')
Run Code Online (Sandbox Code Playgroud)

但它一直导致同样的错误

TypeError: cannot safely cast non-equivalent float64 to int64
Run Code Online (Sandbox Code Playgroud)

我可以做什么来转换列?

Har*_*vey 33

无需更换 nan。您可以通过执行以下操作Int64 安全地通过:

df['A'] = np.floor(pd.to_numeric(df['A'], errors='coerce')).astype('Int64')
Run Code Online (Sandbox Code Playgroud)

您的nans将被替换为<NA>. 来源

您需要有 pandas >.24 版本。

  • 正如上面的评论, ```pd.to_numeric(df[col], error='coerce').astype('Int64')``` 给我带来了同样的错误,但是 ```pd.to_numeric(df[col ], error='coerce').astype(int)``` 有效,结果发现 dtype 是 `Int64`,所以工作正常。但这是应该的吗?当显式(即更多Pythonic)转换失败时,为什么会隐式转换为Int64? (2认同)

big*_*nty 4

import numpy as np
orginalData[NumericColumns] = orginalData[NumericColumns].fillna(0).astype(np.int64, errors='ignore')
Run Code Online (Sandbox Code Playgroud)

对于 NaN,您需要将 NaN 替换为 0,然后进行类型转换

  • 没有运气。我运行了它..没有错误(因为我们忽略了它)但是当我检查列类型时它仍然是 float64 (2认同)
  • 我认为你需要 `df.fillna(0)` 然后进行转换 (2认同)