Pandas:ValueError:无法将float NaN转换为integ

2024-10-01 17:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到值错误:无法将浮点NaN转换为整数,原因如下:

df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)
  • “x”显然是csv文件中的一个列,但我无法在文件中找到任何float NaN,也无法理解它的含义。
  • 当我将列作为字符串读取时,它的值如-1,0,1,…2000,在我看来都是非常漂亮的整数。
  • 当我将列读为float时,就可以加载它了。然后它将值显示为-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)

Tags: 文件csv方法pandasdfread错误原因
3条回答

要识别NaN值,请使用^{}

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

然后,对于删除所有非数值,请将^{}与参数errors='coerce'一起使用-它将非数值替换为NaN

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

若要删除列x中具有NaNs的所有行,请使用^{}

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

上次将值转换为ints:

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

我知道这已经得到了回答,但我想为将来的任何人提供另一种解决方案:

您可以使用.loc仅通过notnull()的值对数据帧进行子集,然后仅对'x'列进行子集。取同一个载体,然后apply(int)到它上面。

如果x列是浮动的:

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

ValueError: cannot convert float NaN to integer

从v0.24开始,你实际上可以。Pandas引入了Nullable Integer Data Types,允许整数与NaNs共存。

给定一系列缺少数据的全浮点数

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()

你的专栏需要有完整的数字,才能进行演员阵容。任何其他操作都会引发类型错误:

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

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

相关问题 更多 >

    热门问题