熊猫系列浮动指数

Posted

技术标签:

【中文标题】熊猫系列浮动指数【英文标题】:Pandas Series float index 【发布时间】:2015-05-28 01:29:26 【问题描述】:

我正在尝试使用浮点数作为熊猫系列的索引,但它似乎无法正常工作。例如,在下面的代码中,当我尝试调用 value policy[9.7] 时,它返回错误。我相信这是因为浮点数 9.7 没有在计算机中精确地存储为 9.7(例如,9.7000000001)。有没有办法解决这个问题?或者使用浮动索引根本不是一个好主意?

非常感谢任何输入。谢谢!

import numpy as np
import pandas as pd
W_grid  = np.arange(100)*0.1
policy = pd.Series(np.random.rand(100), index = W_grid)

policy[9.7]

KeyError                                  Traceback (most recent call last)
<ipython-input-224-89dfc3470c3d> in <module>()
----> 1 policy[9.7]

D:\Warren\Anaconda\lib\site-packages\pandas\core\series.pyc in __getitem__(self, key)
    482     def __getitem__(self, key):
    483         try:
--> 484             result = self.index.get_value(self, key)
    485 
    486             if not np.isscalar(result):

D:\Warren\Anaconda\lib\site-packages\pandas\core\index.pyc in get_value(self, series, key)
   2038 
   2039         k = _values_from_object(key)
-> 2040         loc = self.get_loc(k)
   2041         new_values = series.values[loc]
   2042         if np.isscalar(new_values) or new_values is None:

D:\Warren\Anaconda\lib\site-packages\pandas\core\index.pyc in get_loc(self, key)
   2091         except (TypeError, NotImplementedError):
   2092             pass
-> 2093         return super(Float64Index, self).get_loc(key)
   2094 
   2095     @property

D:\Warren\Anaconda\lib\site-packages\pandas\core\index.pyc in get_loc(self, key)
   1179         loc : int if unique index, possibly slice or mask if not
   1180         """
-> 1181         return self._engine.get_loc(_values_from_object(key))
   1182 
   1183     def get_value(self, series, key):

D:\Warren\Anaconda\lib\site-packages\pandas\index.pyd in pandas.index.IndexEngine.get_loc (pandas\index.c:3656)()

D:\Warren\Anaconda\lib\site-packages\pandas\index.pyd in pandas.index.IndexEngine.get_loc (pandas\index.c:3534)()

D:\Warren\Anaconda\lib\site-packages\pandas\hashtable.pyd in pandas.hashtable.Float64HashTable.get_item (pandas\hashtable.c:9645)()

D:\Warren\Anaconda\lib\site-packages\pandas\hashtable.pyd in pandas.hashtable.Float64HashTable.get_item (pandas\hashtable.c:9586)()

KeyError: 9.7

【问题讨论】:

使用 float dtype 作为索引不是一个好主意,它有时可能会起作用,但不能保证。您是否有理由需要浮动索引? 只是为了方便。否则我需要另一个数组来记录值——我想这就是我必须做的。 您始终可以使用乘数 - 例如,代替 np.arange(100)*0.1,使用 np.arange(1000),然后稍后在代码中更正乘数。 【参考方案1】:

您使用的是哪个版本的 Pandas?

根据documents:

Float64Index

注意从 0.14.0 开始,Float64Index 由本机支持 float64 数据类型数组。在 0.14.0 之前,Float64Index 由 对象 dtype 数组。在后端使用 float64 dtype 可以加快速度 大约 30 倍的算术运算和布尔索引运算 Float64Index 本身的速度大约是 2 倍。 0.13.0 版中的新功能。

默认情况下,传递时会自动创建一个 Float64Index 索引创建中的浮动或混合整数浮动值。这 启用纯基于标签的切片范例,使 [],ix,loc 用于 标量索引和切片的工作方式完全相同。

【讨论】:

0.14.1 ,最新版本。 @user3821012 最新版本现在是 0.16.0

以上是关于熊猫系列浮动指数的主要内容,如果未能解决你的问题,请参考以下文章

基于索引从大熊猫系列列表中提取到另一个大熊猫系列

如何使用一系列列名从熊猫数据框中获取系列?

分组合并熊猫列的系列(本身就是一个系列)

如何用十进制创建熊猫系列?

对索引熊猫系列进行排序时出错

将具有相同索引的熊猫系列列表转换为字典