使用Pandas to_csv导出CSV时如何抑制大数的科学计数法?
解决CSV写入时大数变成指数格式的问题
嗨,这个坑我之前处理用户手机号、账号数据的时候也踩过!科学计数法不仅看着闹心,后续导入还容易丢精度,给你几个直接好用的解决办法:
方法1:读取SQL时直接指定列类型为字符串
从数据库读取数据时,如果提前知道哪些列是需要保留原样的大数(比如账号、手机号),直接把这些列指定为字符串类型,从根源避免被识别成数值型。
修改你读取SQL的代码:
# 替换成你实际需要保留的列名 str_columns = ['account_id', 'phone_num'] # 读取时指定dtype参数 itr = pd.read_sql_query(sql, connection, chunksize=chunksize, dtype={col: str for col in str_columns})
这样每个chunk读进来的目标列都是字符串,后续写入CSV时就不会转换成科学计数法了,还能保留前导0这类特殊格式。
方法2:读取后转换列类型为字符串
如果已经读入数据才发现问题,可以在拼接Dask DataFrame之前,把目标列转成字符串类型:
修改你的循环代码:
str_columns = ['account_id', 'phone_num'] # 替换为实际列名 for i in itr: # 将指定列转换为字符串 i[str_columns] = i[str_columns].astype(str) if count == 0: df.append(dd.from_pandas(i, chunksize=chunksize)) else: i.index += count * chunksize df.append(dd.from_pandas(i, chunksize=chunksize)) count += 1
之后再执行dfs = dd.concat(df)和写入操作就没问题了。
方法3:写入CSV时指定格式化规则(适合数值型列)
如果因为某些原因不能转成字符串,也可以在写入时强制格式化数值为普通整数格式:
# 假设目标列是数值型,用lambda函数格式化 dfs.to_csv(csv_file, index=False, formatters={'account_id': lambda x: f'{int(x)}', 'phone_num': lambda x: f'{int(x)}'})
不过这个方法只适合没有小数的整数列,而且如果有前导0会丢失,所以优先推荐前两种方法。
注意事项
- 确认目标列不需要进行数值计算(比如账号、手机号本来就是标识类数据),转成字符串完全不影响后续使用。
- 如果是Dask DataFrame,
astype方法和Pandas用法一致,指定列名和类型即可。
内容的提问来源于stack exchange,提问作者Hemanth S. Vaddi
相关产品推荐
相关产品推荐

