You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:24:34