2015-03-24 12 views
5

Ich versuche Float-Nummern als Index für Pandas Series zu verwenden, aber es scheint nicht zu funktionieren. Wenn ich beispielsweise im folgenden Code versuche, die Wert-Richtlinie [9.7] aufzurufen, wird der Fehler zurückgegeben. Ich glaube, dies liegt an der Tatsache, dass die Gleitzahl 9,7 nicht genau als 9,7 in dem Computer gespeichert ist (z. B. 9,7000000001). Gibt es da irgendwie um das zu umgehen? Oder ist es einfach keine gute Idee, den Float-Index zu verwenden?Pandas Series float index

Jede Eingabe wird sehr geschätzt. Vielen Dank!

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 
+1

Es ist keine gute Idee, float dtype als Index zu verwenden, es kann manchmal funktionieren, aber es ist nicht garantiert. Gibt es einen Grund, warum Sie Floaten für den Index benötigen? – EdChum

+0

Nur für die Bequemlichkeit. Ansonsten brauche ich ein anderes Array, um die Werte aufzuzeichnen - ich denke, das muss ich tun. – user3821012

+0

Sie könnten immer einen Multiplikator verwenden - zum Beispiel statt "np.arange (100) * 0.1", verwenden Sie stattdessen "np.arange (1000)", dann korrigieren Sie den Multiplikator später in Ihrem Code. – MattDMo

Antwort

0

Welche Version von Pandas verwenden Sie?

Per der documents:

Float64Index

Hinweis Ab 0.14.0 wird Float64Index unterstützt von einem nativen float64 dtype Array. Vor 0.14.0 wurde Float64Index von einem Objekt dtype-Array unterstützt. Die Verwendung eines float64 dtype im Backend beschleunigt arithmetische Operationen um etwa 30x und boolesche Indexierungsoperationen auf der Float64Index selbst sind etwa doppelt so schnell. Neu in Version 0.13.0.

Standardmäßig wird ein Float64Index automatisch erstellt, wenn Floating oder Mixed-Integer-Floating-Werte bei der Indexerstellung übergeben werden. Diese ermöglicht ein reines Label-basiertes Slicing-Paradigma, das [], ix, loc für skalare Indizierung und Slicing-Arbeit genau gleich macht.

+0

0.14.1, die neueste Version. – user3821012

+0

@ user3821012 neueste Version ist jetzt 0.16.0 – EdChum