Python 熊猫';指定数据类型时不起作用?

Python 熊猫';指定数据类型时不起作用?,python,pandas,types,rounding,Python,Pandas,Types,Rounding,在定义自己的数据类型后,pandas.round()无法按预期工作时,我遇到了一个问题。我用v。0.24.2 假设我将数据设置为float64,我想将数据设置为float32,以节省一些内存,我想进行一些舍入: import pandas as pd my_dtypes = {'val': 'float32'} my_decimals = {'val': 4} df = pd.DataFrame({'val': [0.14579999446868896]}) # <- this wil

在定义自己的数据类型后,
pandas.round()
无法按预期工作时,我遇到了一个问题。我用v。0.24.2

假设我将数据设置为
float64
,我想将数据设置为
float32
,以节省一些内存,我想进行一些舍入:

import pandas as pd

my_dtypes = {'val': 'float32'}
my_decimals = {'val': 4}

df = pd.DataFrame({'val': [0.14579999446868896]}) # <- this will be 'float64' 
df_mydtypes = df.astype(my_dtypes)

df_rounded = df.round(my_decimals)
df_mydtypes_rounded = df_mydtypes.round(my_decimals)

从表面上看,它看起来不错,但如果我们仔细观察(就像我的unittest那样),它的值就不同了:

0    0.1458
Name: val, dtype: float64
0    0.1458
Name: val, dtype: float32
0.1458
0.14579999446868896

这是怎么回事?

我认为这与计算机科学中一个更普遍的问题有关,也与浮点数的存储方式有关。有关详细说明,请参见Python文档中的

处理此问题的一些方法:

  • 我注意到
    .values
    .iloc
    确实生成了正确的数字,但是
    to_list()
    .item()
    没有生成正确的数字。我猜这与
    pandas
    如何处理和生成底层
    numpy
    数组有关
  • Python还有一个模块,以防您需要“人”浮动而不是计算机浮动
0    0.1458
Name: val, dtype: float64
0    0.1458
Name: val, dtype: float32
0.1458
0.14579999446868896