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

为何Pandas将整数-1转为-1.0?数据类型异常排查

问题根源

整数变浮点数是Pandas自动类型推断导致的:

  • pd.read_csv() 默认会把包含缺失值(或混合类型)的整数列推断为 float 类型(因为原生int无法存储缺失值,float可用NaN表示)。
  • 你的drop_extra_column函数用Python标准库csv处理,读写的都是原始字符串,不会修改数据类型,所以问题肯定出在process_csv_files的Pandas读写环节。
解决办法

1. 读文件时强制指定列类型

提前明确目标列的类型,用dtype参数指定,支持可空整数类型(适合列内有缺失值的场景):

# 示例:指定Open和location列为可空整数类型
df = pd.read_csv(file, dtype={'Open': 'Int64', 'location': 'Int64'})

如果列内没有缺失值,也可以直接用原生int类型:

df = pd.read_csv(file, dtype={'Open': int})

2. 读入后转换列类型

不确定列类型的情况下,读入后将目标列转换为可空整数类型:

df = pd.read_csv(file)
# 转换Open列为可空整数
if 'Open' in df.columns:
    df['Open'] = df['Open'].astype('Int64')
# 修复location列的类型问题:先把合法浮点数转为字符串,再执行格式化逻辑
if 'location' in df.columns:
    df['location'] = df['location'].apply(lambda x: str(int(x)) if pd.notna(x) and x.is_integer() else x)
    df['location'] = df['location'].apply(format_location)

这里额外处理location列是因为:如果原始location是整数,被Pandas转成float后,format_location里的isinstance(location, str)判断会失效,直接返回浮点数,所以需要先转成字符串再执行格式化。

3. 写文件前转为整数格式

如果只需要在输出CSV时去掉.0后缀,可以在写文件前对目标列做转换:

# 将Open列中合法的浮点数转为整数,缺失值保持原样
df['Open'] = df['Open'].apply(lambda x: int(x) if pd.notna(x) and x.is_integer() else x)
df.to_csv(output_path, index=False)

注意:这种方法仅适用于列内浮点数都是整数的场景,否则会丢失小数精度。

额外提醒
  • 先检查原始CSV的目标列是否存在空单元格,这是Pandas将整数转为float的最常见原因。
  • 要兼容Elasticsearch的整数类型,确保输出CSV中没有.0后缀的数值,上述方法都能实现该效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:43:41