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

使用pd.read_csv()时部分字符串单元格被识别为NaN的问题求助

解决pd.read_csv读取时合法字符串被识别为NaN/空白的问题

以下是针对该问题的排查和解决思路:

  • 检查单元格隐藏字符
    肉眼不可见的空格、制表符、换行符或零宽空格等字符,会导致pandas误判为缺失值,关闭na_filter后则显示为空白。

    • 排查方法:用repr()查看单元格原始内容,比如print(repr(df.loc[问题行索引, '目标列'])),能直观暴露隐藏字符。
    • 解决方法:
      1. 读取时添加skipinitialspace=True跳过字段开头的空格;
      2. 读取后对目标列做清理:df['目标列'] = df['目标列'].str.strip();
      3. 用str.replace()替换特定隐藏字符,比如df['目标列'] = df['目标列'].str.replace('\u200b', '')(针对零宽空格)。
  • 排查CSV格式解析错误
    若问题行的字符串包含分隔符、引号配对错误,会导致pandas解析时字段错位,目标列实际被填充了空值。

    • 解决方法:
      1. 明确指定分隔符,比如是制表符就用sep='\t',若字段含逗号则搭配quotechar='"';
      2. 切换解析引擎为Python:pd.read_csv('file.csv', engine='python'),Python引擎对复杂格式兼容性更好;
      3. 强制按引号规则解析:导入csv模块后设置quoting=csv.QUOTE_ALL,确保所有带引号的字段被正确识别。
  • 验证文件编码
    特殊编码下字符无法被正确解析,会显示为空白或被标记为NaN。

    • 排查方法:用chardet检测编码:
      import chardet
      with open('file.csv', 'rb') as f:
          print(chardet.detect(f.read()))
      
    • 解决方法:用检测到的编码读取,比如pd.read_csv('file.csv', encoding='latin-1')。
  • 清空缺失值映射规则
    即使关闭keep_default_na=False,若na_values参数有自定义值,仍会将指定内容转为NaN;关闭na_filter后空白可能是原始解析时的残留问题。

    • 解决方法:读取时明确设置na_values=[],彻底清空缺失值映射:
      pd.read_csv('file.csv', na_filter=False, na_values=[], keep_default_na=False)
      
  • 手动逐行解析对比
    用Python原生csv模块解析问题行,对比pandas的解析结果,定位是否为pandas解析逻辑的问题:

    import csv
    with open('file.csv', 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        target_rows = [90, 91]  # 替换为你的问题行号
        for idx, row in enumerate(reader):
            if idx in target_rows:
                print(f"行号{idx}: {row['目标列']}")
                print(f"原始内容: {repr(row['目标列'])}")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:21:37