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

为何pandas.read_csv指定engine='python'时,数字点字符串的点会被移除?

Pandas read_csv中Python引擎与C引擎处理thousands参数的差异问题

这是Python引擎的正常行为,并非遗漏设置,核心原因是两个引擎处理thousands参数的逻辑顺序不同:

  • C引擎:会先根据dtype指定或自动推断列类型,仅对被识别为数值类型的列应用千位分隔符的替换操作;对于指定为字符串类型的列,会直接保留原始文本内容,不会处理千位分隔符。
  • Python引擎:会先全局对所有列执行千位分隔符的替换操作,再根据dtype进行类型转换。也就是说,哪怕你指定了某列为字符串类型,替换.的操作已经提前完成,最终读取的字符串自然会丢失所有点号。

解决方案

  1. 优先使用C引擎(推荐)
    只要你的使用场景没有用到C引擎不支持的特性(比如复杂正则分隔符等),直接使用engine='c'就能得到符合预期的结果,就像测试代码中的df1一样。

  2. 必须使用Python引擎时的替代方案
    分两步处理,先保留原始字符串,再手动处理数值列的千位分隔符:

    import pandas as pd
    import io
    
    data = "\"\"\"a;b;c\n0000.7995;16.000;0\n3.03.001.00514;0;4.000\n4923.600.041;23.000;131\"\"\""
    
    # 第一步:不指定thousands,读取所有列,a列保留原始格式
    df_raw = pd.read_csv(io.StringIO(data), sep=';', dtype={'a': str})
    # 第二步:手动替换数值列的千位分隔符并转换类型
    df_raw['b'] = df_raw['b'].str.replace('.', '').astype(int)
    df_raw['c'] = df_raw['c'].str.replace('.', '').astype(int)
    

    处理后的结果和C引擎的输出完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:05:31