此场景是ETL场景的简化,涉及从MySQL表中提取的多组数据。我有一个合并的数据框,其中一个价格列是类型float64
,另一个是类型object
import pandas as pd
df = pd.DataFrame({
'price1': [0.066055],
'price2': ['0.066055'],
})
>>> df.dtypes
price1 float64
price2 object
dtype: object
当这两列被转换为float64
时,列price1
在四舍五入到5位时被错误地四舍五入
float64_df = df[price_cols].apply(lambda x: pd.to_numeric(x))
>>> float64_df.dtypes
price1 float64
price2 float64
dtype: object
>>> float64_df[price_cols].apply(lambda x: x.round(5))
price1 price2
0 0.06606 0.06605
但是,当使用downcast='float'
将列转换为float32
时,舍入效果与预期一样
float32_df = df[price_cols].apply(lambda x: pd.to_numeric(x, downcast='float'))
>>> float32_df.dtypes
price1 float32
price2 float32
dtype: object
>>> float32_df[price_cols].apply(lambda x: x.round(5))
price1 price2
0 0.06606 0.06606
你知道为什么当两列都是float64
类型时舍入不能正常工作吗
简短的回答是
pd.to_numeric
为两个输出不同的值:在
0.066055
的情况下,它simply returns the value在
'0.066055'
的情况下,我相信它使用this function将字符串转换为浮点This answer也可能有帮助
以更高的精度打印浮点显示
pd.to_numeric
将'.066055'
转换为0.06605499999999998872
输出:
用浮点数获得精确的数字有些不可能,而且浮点数总是有些不可预测。我的猜测是,该对象导致浮点64比原始数字小一点,例如0.06605499999999999或类似数字,从而导致意外的舍入结果
Python对此有一些看法
相关问题 更多 >
编程相关推荐