【发布时间】:2018-04-30 04:51:06
【问题描述】:
我得到 ValueError: cannot convert float NaN to integer 如下:
df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)
- “x”显然是 csv 文件中的一列,但我无法在文件中发现任何 float NaN,并且不明白这是什么意思。
- 当我将该列读取为字符串时,它的值类似于 -1,0,1,...2000,在我看来都是非常好的 int 数字。
- 当我将该列读取为浮点数时,可以加载它。然后它显示值为 -1.0,0.0 等,仍然没有任何 NaN-s
- 我尝试使用 error_bad_lines = False 和 read_csv 中的 dtype 参数无济于事。它只是取消加载相同的异常。
- 文件不小(10+ M 行),所以无法手动检查,当我提取一个小的标题部分时,没有错误,但它发生在完整文件中。所以它是文件中的东西,但无法检测到什么。
- 从逻辑上讲,csv 不应该有缺失值,但即使有一些垃圾,我也可以跳过这些行。或者至少可以识别它们,但我看不到扫描文件并报告转换错误的方法。
更新:使用 cmets/answers 中的提示我得到了我的数据:
# 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)
【问题讨论】:
-
试试看
df[df['x'].isnull()] -
你需要弄清楚你想用任何 NaN 做什么,然后去做。
-
感谢@jezrael,现在 df[df['x'].isnull()] 确实用“NaN”标识了一行,我可以删除它!现在有了另一个类似的领域 - 这似乎有一些其他的垃圾不是 int。是否有通用的方法来查找无法转换为给定数据类型的行,以便我可以识别它们并将它们全部丢弃?
-
使用
pd.to_numeric和errors = coerce而不是 astype int 然后fillna随便你。 -
在 v0.24 中,pandas 引入了 Nullable 整数类型,它支持带有 NaN 的整数列。请参阅this answer 了解更多信息。