如何使用pandas将CSV字段中的科学计数法转换为字符串
问题根源
你当前的写法失效是因为原始CSV里的目标字段已经以科学计数法的文本形式存储,使用dtype=str读取时会直接把5.51E+14这类科学计数法字符串原样读入,没有做数值解析,因此输出时还是科学计数法格式。
可行解决方法
方法1:使用converters参数在读取时直接转换(常规场景够用)
自定义转换函数,读取每一行的目标字段时,先将科学计数法字符串解析为数值,再转为完整的整数字符串:
import pandas as pd # 自定义科学计数法字符串转完整整数字符串的函数 def sci_to_str(sci_str): # 跳过空值处理(如果没有空值可以去掉判断) if not sci_str or pd.isna(sci_str): return "" return str(int(float(sci_str))) lst_str_cols = ['FIPS_BLOCK', 'FIPS_BLKGR', 'FIPS_TRACT','FIPS_PLACE'] # 构建转换器字典,对每个目标列应用转换函数 col_converters = {col: sci_to_str for col in lst_str_cols} # 读取时传入转换器 df = pd.read_csv(f"{output_files_dir}/{output_shp_name}.csv", converters=col_converters) # 输出时关闭索引,同时指定浮点数格式避免其他数值列输出科学计数法 df.to_csv(f"{output_files_dir}/{output_shp_name}.csv", index=False, float_format="%f")
方法2:高精度转换(适配超长数值场景)
如果目标字段长度超过16位,用float转换会出现精度丢失,可以用decimal模块做高精度解析:
import pandas as pd from decimal import Decimal def sci_to_str_high_prec(sci_str): if not sci_str or pd.isna(sci_str): return "" return str(int(Decimal(sci_str))) # 后续读取逻辑和方法1一致,转换器替换为上面的函数即可 lst_str_cols = ['FIPS_BLOCK', 'FIPS_BLKGR', 'FIPS_TRACT','FIPS_PLACE'] col_converters = {col: sci_to_str_high_prec for col in lst_str_cols} df = pd.read_csv(f"{output_files_dir}/{output_shp_name}.csv", converters=col_converters) df.to_csv(f"{output_files_dir}/{output_shp_name}.csv", index=False, float_format="%f")
注意事项
- 如果原始CSV的目标列存在非数值格式的异常值,需要在转换函数中额外增加异常捕获逻辑
- 输出时添加
index=False可以避免pandas默认写入多余的索引列
内容的提问来源于stack exchange,提问作者DiamondJoe12
相关产品推荐
相关产品推荐

