繁体   English   中英

Pandas:ValueError:无法将浮点 NaN 转换为整数

[英]Pandas: ValueError: cannot convert float NaN to integer

我得到ValueError: cannot convert float NaN to integer for following:

df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)
  • “x”显然是 csv 文件中的一列,但我无法在文件中发现任何浮点 NaN ,也不明白这是什么意思。
  • 当我将列读取为字符串时,它具有像 -1,0,1,...2000 这样的值,对我来说,所有的整数看起来都非常好。
  • 当我将列读取为浮动时,可以加载它。 然后它将值显示为 -1.0,0.0 等,仍然没有任何 NaN-s
  • 我尝试在read_csv 中使用error_bad_lines = False和 dtype 参数无济于事。 它只是以相同的异常取消加载。
  • 该文件不小(10+ M 行),因此无法手动检查它,当我提取一个小的标题部分时,没有错误,但它发生在完整文件中。 所以它是文件中的东西,但无法检测到什么。
  • 从逻辑上讲,csv 不应该有缺失值,但即使有一些垃圾,我也可以跳过这些行。 或者至少识别它们,但我看不到扫描文件和报告转换错误的方法。

更新:使用评论/答案中的提示,我用这个清理了我的数据:

# x contained NaN
df = df[~df['x'].isnull()]

# Y contained some other garbage, so null check was not enough
df = df[df['y'].str.isnumeric()]

# final conversion now worked
df[['x']] = df[['x']].astype(int)
df[['y']] = df[['y']].astype(int)

要识别NaN值,请使用boolean indexing

print(df[df['x'].isnull()])

然后删除所有非数字值使用to_numeric和参数errors='coerce' - 将非数字值替换为NaN s:

df['x'] = pd.to_numeric(df['x'], errors='coerce')

要删除x列中带有NaN的所有行,请使用dropna

df = df.dropna(subset=['x'])

最后将值转换为int s:

df['x'] = df['x'].astype(int)

ValueError:无法将浮点 NaN 转换为整数

从 v0.24 开始,您实际上可以。 Pandas 引入了Nullable Integer 数据类型,它允许整数与 NaN 共存。

给定一系列缺失数据的整浮点数,

s = pd.Series([1.0, 2.0, np.nan, 4.0])
s

0    1.0
1    2.0
2    NaN
3    4.0
dtype: float64

s.dtype
# dtype('float64')

您可以将其转换为可为空的 int 类型(从Int16Int32Int64之一中选择),

s2 = s.astype('Int32') # note the 'I' is uppercase
s2

0      1
1      2
2    NaN
3      4
dtype: Int32

s2.dtype
# Int32Dtype()

您的专栏需要有整数才能进行演员表。 其他任何事情都会引发 TypeError:

s = pd.Series([1.1, 2.0, np.nan, 4.0])

s.astype('Int32')
# TypeError: cannot safely cast non-equivalent float64 to int32

此外,即使在最新版本的熊猫中,如果列是对象类型,您也必须先转换为浮点数,例如:

df['column_name'].astype(np.float).astype("Int32")

注意:出于某种原因,您必须先通过 numpy float 再到可空 Int32。

int 的大小(如果是 32 或 64)取决于您的变量,请注意,如果您的数字对于格式来说太大,您可能会失去一些精度。

我知道这已得到解答,但希望将来为任何人提供替代解决方案:

您可以使用.loc仅按notnull()值对数据帧进行子集化,然后仅对'x'列进行子集化。 取相同的向量,然后对其apply(int)

如果列 x 是浮动的:

df.loc[df['x'].notnull(), 'x'] = df.loc[df['x'].notnull(), 'x'].apply(int)

如果你有空值那么在做数学运算你会得到这个错误来解决它使用df[~df['x'].isnull()]df[['x']].astype(int)如果你想要你的数据集不可更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM