Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 浮点值的数据帧相减产生与预期值不同的值_Python 3.x_Pandas_Database - Fatal编程技术网

Python 3.x 浮点值的数据帧相减产生与预期值不同的值

Python 3.x 浮点值的数据帧相减产生与预期值不同的值,python-3.x,pandas,database,Python 3.x,Pandas,Database,数据帧(df)中有2列/系列,如下所示: 0 0.657012 1 0.338250 2 0.652448 Name: prob1, dtype: float64 0 0.657012 1 0.338249 2 0.652448 Name: prob2, dtype: float64 0 2.384000e-07 1 1.192000e-07 2 2.384000e-07 Name: diff, dtype: float64 当我执行以

数据帧(df)中有2列/系列,如下所示:

0    0.657012
1    0.338250
2    0.652448
Name: prob1, dtype: float64

0    0.657012
1    0.338249
2    0.652448
Name: prob2, dtype: float64
0    2.384000e-07
1    1.192000e-07
2    2.384000e-07
Name: diff, dtype: float64
当我执行以下减法操作时:

df['diff'] = df.prob1 - df.prob2
 
我得到了与预期不同的错误结果,如下所示:

0    0.657012
1    0.338250
2    0.652448
Name: prob1, dtype: float64

0    0.657012
1    0.338249
2    0.652448
Name: prob2, dtype: float64
0    2.384000e-07
1    1.192000e-07
2    2.384000e-07
Name: diff, dtype: float64
为什么呢


非常感谢和感谢。

这是因为数据类型在
float
中,结果值非常小,因此使用了科学的符号。 您可以使用round函数获得所需的输出

df['result'] = (df.prob1 - df1.prob2).apply(round,1)
或者,您可以操纵pandas选项,以浮点格式而非科学符号显示结果-

pd.set_option('display.float_format', lambda x: '%.5f' % x)
df['result'] = df.prob1 - df1.prob2

# or

pd.options.display.float_format = '{:.5f}'.format
另一种选择是使用apply-

df['diff'] = df.prob1 - df.prob2
df['diff'].apply(lambda x: '%.5f' % x)
根据,显示浮点值的默认精度为6(即,使用浮点打印数据帧将在小数点后显示6个值)

这不会更改数据框中存储的值,只是更改打印时显示的值。因此,当打印数据帧时,看起来值应该是相同的,但对存储的值执行数学运算(与您看到的不同),因此结果似乎不一致

我建议打印几个单独的值(即对列和索引进行索引以访问单个值),并与打印整个数据帧/系列时看到的值进行比较。单独打印时,您应该看到整个值,并且这些值应该与您从数学运算中获得的结果一致

或者,您可以通过以下方式更改display.precision:

pd.set_option('precision', n)

其中
n
是要显示的小数点后的位数(默认为6)

由于差异非常小,请根据需要修改小数点为10位

df['diff'] = np.round(df.prob1 - df.prob2, decimals=10) # OR
df['diff'] = df.prob1.sub(df.prob2).round(10)
输出

    prob1       prob2       diff
0   0.657012    0.657012    0.000000
1   0.338250    0.338249    0.000001
2   0.652448    0.652448    0.000000

谢谢你的回答。即使结果很小,我仍然希望在以后打印时使用结果。如果四舍五入到8,我得到零。set_选项仅在显示值时有效,但内存中的实际值不变?我尝试了另一种选择,它是说没有轴参数为lambda。我怎样才能解决这个问题,非常感谢。密谋会奏效的。舍入将仅去除数据,以所需格式显示数据。并删除轴参数,然后在应用lambda函数后尝试打印,它与结果操作中的值不一致。例如我得到了2的值,这是不可能的,因为差值的数量非常小,应该是2?为什么不把这个数据乘以一些大的数字,比如100000,然后取差值?因为我想要一个介于0-1之间的间隔。