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

我尝试将从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),转类型后会产生微小的精度误差,表现为显示多位小数。解决方式:
- 调整操作顺序:先做类型转换,再执行四舍五入,避免精度误差覆盖四舍五入结果。
- 若仅需显示两位小数,无需修改数据存储,可设置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
相关产品推荐
相关产品推荐

