为什么Pandas.DataFrame.iloc转换为numpy.float64并四舍五入?

时间:2018-12-12 21:38:47

标签: python python-3.x pandas numpy

以该数字为例:

1.64847910404205

如果我创建一个带有行和该值的Pandas DataFrame:

df = pd.DataFrame([{'id': 77, 'data': 1.64847910404205}])

然后遍历各行(好吧...“行”)并检查:

for index, row in df.iterrows():
    if index > 0:
        previous_row = df.iloc[index]

当然,上面的内容很奇怪:为什么我要遍历这些行只是为了从DF中拉出同一行?算了我删除了-1进行说明。

现在,如果我使用SciView(属于IntelliJ的一部分)和data标签来逐行检查行,我会得到:

row
data: 1.64847910404205

previous_row
data: 1.64847910404

请注意,previous_row已四舍五入。这是因为出于某种原因它们是不同的数据类型...

row: 
type(row) #float64

previous_row:
type(previous_row) #numpy.float64

我很好奇:为什么iloc会转换为numpy.float64,我又如何防止它转换呢?

我需要与稍后进行峰值信噪比(PSNR)计算相同的精度。当然,我可以将float转换为numpy.float64,但我不想失去精度。

1 个答案:

答案 0 :(得分:1)

数据框中'data'列的类型为numpy.float64,即使Pandas仅将其报告为float64也是如此。您可以通过以下方法向自己证明这一点:

df['data'].dtype.type is numpy.float64

,它将返回True。另一种形式是:

type(df['data'].values[0]) is numpy.float64

,它也会返回True

显示上的任何差异都取决于SciView解释代码的方式。