为何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
相关产品推荐
相关产品推荐

