我有一个浮动列表(实际上它是一个pandas Series对象,如果它改变了什么),看起来像这样:
mySeries:
...
22 16.0
23 14.0
24 12.0
25 10.0
26 3.1
...
(因此,本系列的元素位于右侧,左侧是索引。)然后,我尝试将此系列中的元素指定为字典中的键,将索引指定为值,如下所示:
{ mySeries[i]: i for i in mySeries.index }
我得到了我想要的东西,除了......
{ 6400.0: 0, 66.0: 13, 3.1000000000000001: 23, 133.0: 10, ... }
为什么3.1
突然变为3.1000000000000001
?我想这与浮点数的表示方式有关(?),但为什么会发生现在,我该如何避免/修复呢?
编辑:如果此问题不准确,请随时为此问题提出更好的标题。
EDIT2:好的,所以它似乎是完全相同的数字,只是打印不同。但是,如果我将mySeries[26]
指定为字典键,然后我尝试运行:
myDict[mySeries[26]]
我得到KeyError
。什么是避免它的最好方法?
答案 0 :(得分:6)
字典不会改变3.1的浮点表示,但它实际上是显示完整的精度。你对mySeries [26]的打印正在截断精度并显示近似值。
你可以证明这一点:
pd.set_option('precision', 20)
然后查看mySeries。
0 16.00000000000000000000
1 14.00000000000000000000
2 12.00000000000000000000
3 10.00000000000000000000
4 3.10000000000000008882
dtype: float64
修改强>:
What every computer programmer should know about floating point arithmetic总是很好读。
修改强>:
关于KeyError,我无法复制问题。
>> x = pd.Series([16,14,12,10,3.1])
>> a = {x[i]: i for i in x.index}
>> a[x[4]]
4
>> a.keys()
[16.0, 10.0, 3.1000000000000001, 12.0, 14.0]
>> hash(x[4])
2093862195
>> hash(a.keys()[2])
2093862195
答案 1 :(得分:3)
该系列中的价值已经是这样了:
>>> x = pd.Series([16,14,12,10,3.1])
>>> x
0 16.0
1 14.0
2 12.0
3 10.0
4 3.1
dtype: float64
>>> x.iloc[4]
3.1000000000000001
这与浮点精度有关:
>>> np.float64(3.1)
3.1000000000000001
有关详情,请参阅Floating point precision in Python array。
关于编辑中的KeyError
,我无法重现。见下文:
>>> d = {x[i]:i for i in x.index}
>>> d
{16.0: 0, 10.0: 3, 12.0: 2, 14.0: 1, 3.1000000000000001: 4}
>>> x[4]
3.1000000000000001
>>> d[x[4]]
4
我怀疑KeyError
来自Series
:mySeries[26]
返回的是什么?