小能豆

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

py

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

df = pandas.read_csv('zoom11.csv')
df[['x']] = df[['x']].astype(int)
  • “x” 是 csv 文件中的一列,我无法在文件中发现任何浮点数 NaN ,而且我不明白该错误或为什么会出现此错误。
  • 当我将该列读为字符串时,它具有 -1,0,1,…2000 等值,对我来说,所有值看起来都是非常漂亮的整数。
  • 当我将列读为浮点数时,就可以加载。然后它显示值为 -1.0、0.0 等,仍然没有任何 NaN
  • 我尝试使用error_bad_lines = False和 read_csv 中的 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)

阅读 21

收藏
2024-10-12

共1个答案

小能豆

你的问题是由于在 CSV 文件的 x 列中存在缺失值或非数字内容而导致转换为整数时失败。根据你的更新,已经找到了一些有效的方法来处理这些问题。但为了让处理更简单和清晰,以下是一些更通用的步骤,帮助你确保数据在转换之前是干净的。

1. 检查并处理 NaN(缺失值)

即使你的数据看起来干净,也有可能某些行包含 NaN,这些值无法直接转换为整数。为了避免转换时出现错误,可以使用 fillna()dropna() 来处理缺失值。

使用 fillna() 填充 NaN 值

如果你希望用某个默认值来替换所有的 NaN,比如 0,你可以使用 fillna()

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('zoom11.csv')

# 填充 NaN 值为 0
df['x'] = df['x'].fillna(0)

# 转换为整数
df['x'] = df['x'].astype(int)

使用 dropna() 删除 NaN 值

如果你希望跳过包含 NaN 的行,可以使用 dropna() 来删除这些行:

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('zoom11.csv')

# 删除包含 NaN 的行
df = df.dropna(subset=['x'])

# 转换为整数
df['x'] = df['x'].astype(int)

2. 处理非数字字符

有时候数据列中会包含非数字字符(例如空白、字符串),这些值不能直接转换为整数。你可以使用 pd.to_numeric() 来处理这些情况,并将无法转换的内容变为 NaN

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('zoom11.csv')

# 将列 'x' 转换为数值类型,将非数字内容变为 NaN
df['x'] = pd.to_numeric(df['x'], errors='coerce')

# 删除包含 NaN 的行
df = df.dropna(subset=['x'])

# 最终转换为整数
df['x'] = df['x'].astype(int)

3. 检查和处理混杂的数据

如果你的数据集较大并且混杂了许多不同类型的数据(例如数字和字符串混合),你可以先进行详细的检查,然后再处理。

检查非数字数据

如果你想查看具体哪些行导致了问题,你可以使用 .isnull() 来查找无法转换的行:

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('zoom11.csv')

# 尝试将 'x' 列转换为数值,非数字的内容会变为 NaN
df['x'] = pd.to_numeric(df['x'], errors='coerce')

# 查找无法转换的行(即 NaN 行)
non_numeric_rows = df[df['x'].isnull()]

# 输出这些行以供检查
print(non_numeric_rows)

通过这种方式,你可以找出问题数据,然后决定是否需要进一步清理或处理。

4. 最终的完整解决方案

结合所有的步骤,你可以按照如下方式来读取、清理并转换你的数据:

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('zoom11.csv')

# 将 'x' 列中的非数字内容转换为 NaN
df['x'] = pd.to_numeric(df['x'], errors='coerce')

# 删除包含 NaN 的行
df = df.dropna(subset=['x'])

# 转换为整数
df['x'] = df['x'].astype(int)

这样,你可以确保数据在转换为整数之前已经被正确清理,从而避免了 NaN 和非数字数据导致的错误。

2024-10-12