Pandas DataFrame导出CSV时如何为各列指定不同小数格式
Pandas导出CSV时逐列单独指定小数位数的实现方法
原有代码不生效的原因
你之前调用df['hpa'].round(decimals=1)这类写法没有效果,核心原因是Pandas的round()方法不会原地修改DataFrame内的列值,只会返回一个完成四舍五入的新Series,你没有将返回值重新赋值给原列,所以导出时读取的还是未舍入的原始数据。
另外to_csv自带的float_format参数只能给所有浮点列设置统一格式规则,确实无法满足逐列定制小数位的需求。
可直接运行的实现方案
方案1:逐列舍入+字符串拼接(完全匹配目标格式)
这个方案可以完全控制每一列的小数位数,同时实现你要求的逗号后带空格、整数列不带.0后缀的效果,和你给出的目标输出100%匹配:
import pandas as pd headers = ['n', 's', 'time', 'm1', 'm2', 'hpa', 't', 'rh', 'td', 'dir', 'spd', 'u', 'v', 'lat', 'lon'] df = pd.read_csv('edt_20220520_2315.txt', encoding_errors='ignore', skiprows=2, sep='\s+', names=headers) # 完成m/s到节的单位换算 df['spdkt'] = df['spd'] * 1.94384 # 先筛选符合气压条件的记录 df_to_write = df[df['hpa'] > 99.9].copy() extract = ['hpa', 'm2', 't', 'td', 'dir', 'spdkt'] with open('test_output.txt', 'w') as fh: for _, row in df_to_write[extract].iterrows(): # 逐列控制格式:气压、温度、露点保留1位小数,其余列取整数,逗号后加空格 line = ( f"{row['hpa'].round(1):.1f}, " f"{int(round(row['m2'], 0))}, " f"{row['t'].round(1):.1f}, " f"{row['td'].round(1):.1f}, " f"{int(round(row['dir'], 0))}, " f"{int(round(row['spdkt'], 0))}" ) fh.write(line + '\n')
运行后输出的文件内容和你预期的格式完全一致。
方案2:Style格式化导出(适合无特殊分隔符要求的场景)
如果你不需要逗号后加空格,可以用Pandas的Style功能逐列绑定格式规则,代码更简洁:
# 接上述代码中筛选完df_to_write、计算完spdkt的部分 format_map = { 'hpa': '{:.1f}', 'm2': '{:.0f}', 't': '{:.1f}', 'td': '{:.1f}', 'dir': '{:.0f}', 'spdkt': '{:.0f}' } df_to_write[extract].style.format(format_map).to_csv( 'test_output.txt', index=False, header=False, sep=',' )
这个方案导出的文件逗号后没有空格,其余小数位规则和要求一致。
注意:如果仅做round操作后直接调用to_csv导出,值为整数的浮点列(比如168.0)会默认保留
.0后缀,必须通过转int或者字符串格式化的方式去掉多余后缀,才能匹配目标格式。
内容的提问来源于stack exchange,提问作者Jason Dunn
相关产品推荐
相关产品推荐

