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

从yfinance获取的浮点序列使用round(2)后无法保留两位小数求助

Image Output

我尝试将从yfinance获取的浮点序列四舍五入到两位小数。尽管使用了round(2)和astype('float32')方法,DataFrame仍无法保留四舍五入结果,各序列显示多位小数。请问我哪里操作有误?

def clean_df(df):
    return (df
    .stack(level=0)
    .swaplevel(0,1,axis=0)
    .sort_index(axis=0, level=None, ascending=True)
    .reset_index(level=[0,1])
    .rename(columns={"level_0": "Symbol"})
    .round({'Open': 2, 'High': 2,'Low': 2,'Close': 2,'Volume': 0})
    .astype({'Symbol':'string','Close':'float32','Open':'float32','High':'float32','Low':'float32','Volume':'int32'})
    )
问题原因及解决办法
  • 核心问题:astype('float32')的执行顺序在round()之后,单精度浮点数的精度限制会破坏四舍五入结果。float32无法精确表示部分十进制小数(比如0.01),转类型后会产生微小的精度误差,表现为显示多位小数。

  • 解决方式:

    1. 调整操作顺序:先做类型转换,再执行四舍五入,避免精度误差覆盖四舍五入结果。
    2. 若仅需显示两位小数,无需修改数据存储,可设置pandas全局显示格式。

修改后的代码示例

def clean_df(df):
    return (df
    .stack(level=0)
    .swaplevel(0,1,axis=0)
    .sort_index(axis=0, level=None, ascending=True)
    .reset_index(level=[0,1])
    .rename(columns={"level_0": "Symbol"})
    .astype({'Symbol':'string','Close':'float32','Open':'float32','High':'float32','Low':'float32','Volume':'int32'})
    .round({'Open': 2, 'High': 2,'Low': 2,'Close': 2,'Volume': 0})
    )

仅调整显示格式的方案

在使用DataFrame前添加以下代码,数据存储精度不变,但显示时只保留两位小数:

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format

内容的提问来源于stack exchange,提问作者greenguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:22:06