如何阻止Python Pandas将指定int列导出时自动转换为float类型
问题原因
你之前的操作未生效,核心是从数据库读取数据时,如果CID1、CID2列存在空值,pandas原生int类型不支持缺失值存储,会自动向上转型为float64类型。此时直接全量执行astype(str)会把整数值转为1234.0这类带小数点后缀的字符串,导出后自然不符合预期。
解决方案
方案1:使用Nullable Int类型处理(支持存在空值的场景)
pandas提供首字母大写的Int64类型(可空整数类型),既支持存储缺失值,又能保留整数格式,处理后再转字符串或直接导出都不会出现小数点后缀。
import pandas as pd # 读取原始数据 data = pd.read_sql(sql, conn) # 单独处理两列为可空整数类型 data['CID1'] = data['CID1'].astype('Int64') data['CID2'] = data['CID2'].astype('Int64') # 如需所有列转为字符串,再执行全量转换,此时两列不会带.0后缀 data = data.astype(str) # 导出时新增na_rep参数,可将空值输出为空字符串,避免出现nan/NA内容 data.to_csv('data_feed_feed.txt', sep='\t', index=True, na_rep='')
方案2:直接转int处理(仅适用于两列无空值的场景)
如果确认CID1、CID2不存在空值,可以直接将两列先转int再转字符串即可:
import pandas as pd data = pd.read_sql(sql, conn) # 单独处理目标列 data['CID1'] = data['CID1'].astype(int).astype(str) data['CID2'] = data['CID2'].astype(int).astype(str) # 其余列转字符串 other_cols = [col for col in data.columns if col not in ['CID1', 'CID2']] data[other_cols] = data[other_cols].astype(str) # 导出 data.to_csv('data_feed_feed.txt', sep='\t', index=True)
注意事项
- 如果你不需要其余列必须为字符串格式,可以不用全量执行
astype(str),处理完目标列后直接导出即可,to_csv会默认按整数格式输出Int64类型的列 - 导出时添加
na_rep参数可以自定义空值的输出内容,避免导出后出现不符合要求的nan/<NA>标识
内容的提问来源于stack exchange,提问作者JLAU1119
相关产品推荐
相关产品推荐

