我收到ValueError:无法将浮点数 NaN 转换为整数:
df = pandas.read_csv('zoom11.csv') df[['x']] = df[['x']].astype(int)
更新:使用评论/答案中的提示,我得到了以下数据:
# 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)
你的问题是由于在 CSV 文件的 x 列中存在缺失值或非数字内容而导致转换为整数时失败。根据你的更新,已经找到了一些有效的方法来处理这些问题。但为了让处理更简单和清晰,以下是一些更通用的步骤,帮助你确保数据在转换之前是干净的。
x
即使你的数据看起来干净,也有可能某些行包含 NaN,这些值无法直接转换为整数。为了避免转换时出现错误,可以使用 fillna() 或 dropna() 来处理缺失值。
NaN
fillna()
dropna()
如果你希望用某个默认值来替换所有的 NaN,比如 0,你可以使用 fillna():
0
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)
如果你希望跳过包含 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)
有时候数据列中会包含非数字字符(例如空白、字符串),这些值不能直接转换为整数。你可以使用 pd.to_numeric() 来处理这些情况,并将无法转换的内容变为 NaN。
pd.to_numeric()
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)
如果你的数据集较大并且混杂了许多不同类型的数据(例如数字和字符串混合),你可以先进行详细的检查,然后再处理。
如果你想查看具体哪些行导致了问题,你可以使用 .isnull() 来查找无法转换的行:
.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)
通过这种方式,你可以找出问题数据,然后决定是否需要进一步清理或处理。
结合所有的步骤,你可以按照如下方式来读取、清理并转换你的数据:
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 和非数字数据导致的错误。