You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas读取混有整数/浮点数的列时将整数识别为NaN的问题

我来帮你梳理下这个问题的排查思路和解决方案,结合你描述的情况,大概率是CSV数据的隐藏格式问题或者pandas的自动类型推断机制踩坑了:

排查与解决方法

1. 先定位目标列的无效内容

那些被识别为NaN的行,很可能藏着肉眼看不到的非数值字符(比如空格、全角符号、换行符),或者是格式异常的字符串。你可以先把目标列按字符串读取,避免pandas自动解析丢失信息,然后找出问题行:

# 替换target_col为你的目标列名称
target_col = "你的目标列名"
# 读取时强制目标列为字符串类型
df_raw = pd.read_csv(f"{dataset}_train{fold}.csv", dtype={target_col: str})
# 筛选出无法转换为浮点数的行
invalid_entries = df_raw[~df_raw[target_col].str.strip().str.replace('.', '', 1).str.isdigit()]
# 打印这些异常内容
print("目标列中的异常内容:")
print(invalid_entries[target_col])

如果发现有特殊字符,直接批量清理后再转数值:

# 清理目标列的非数字/小数点字符
df_raw[target_col] = df_raw[target_col].str.strip().replace(r'[^\d.]', '', regex=True)
# 转换为浮点数,无法转换的设为NaN
df_raw[target_col] = pd.to_numeric(df_raw[target_col], errors='coerce')

2. 强制指定类型并处理解析错误

pandas的自动类型推断有时候会因为前几千行都是正常浮点数,后面出现异常值就直接把整列推断成object类型,导致后续行解析失败。你可以在读取时指定类型,再强制转换:

df_train = pd.read_csv(
    f"{dataset}_train{fold}.csv",
    dtype={target_col: str}  # 先读成字符串
)
# 转换为数值类型,errors='coerce'会把无效值转成NaN,换成'raise'可以直接抛出错误定位问题
df_train[target_col] = pd.to_numeric(df_train[target_col], errors='coerce')
# 如果是全整数的数据集,还可以用downcast优化内存
# df_train[target_col] = pd.to_numeric(df_train[target_col], errors='coerce', downcast='integer')

3. 检查CSV的字段完整性

虽然你清理了末尾的多余逗号,但可能某些行存在字段数量和表头不匹配的情况(比如字段内容里包含未转义的逗号),导致pandas错位解析,目标列因此出现NaN。你可以用csv模块检查每行的字段数:

import csv
with open(f"{dataset}_train{fold}.csv", 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    header = next(reader)
    header_length = len(header)
    for row_num, row in enumerate(reader, start=2):  # 行号从2开始,因为表头是第1行
        if len(row) != header_length:
            print(f"第{row_num}行字段数异常:实际{len(row)}个,表头{header_length}个")

如果发现字段数不一致,需要处理这些行的格式(比如给包含逗号的字段加上引号)。

4. 自定义空值识别规则

如果你的数据集里用了非标准的空值占位符(比如"--"、"N/A"、"空"),pandas默认不会把它们识别为NaN,导致转换失败。你可以在读取时指定这些值:

df_train = pd.read_csv(
    f"{dataset}_train{fold}.csv",
    na_values=['--', 'N/A', 'null', '']  # 把这些自定义占位符识别为NaN
)
# 再强制转换目标列类型
df_train[target_col] = df_train[target_col].astype(float)

内容的提问来源于stack exchange,提问作者user9781778

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:34:50