2015-03-24 19 views
5

Sto provando a utilizzare i numeri float come indice per le serie panda, ma non sembra funzionare in modo appropriato. Ad esempio, nel seguente codice, quando provo a chiamare la politica del valore [9.7], restituisce un errore. Credo che ciò sia dovuto al fatto che il numero di galleggiante 9.7 non è memorizzato precisamente come 9.7 nel computer (ad esempio 9.7000000001). C'è un modo per aggirarlo? O semplicemente non è una buona idea usare l'indice float?Indice float della serie Pandas

Qualsiasi input è molto apprezzato. Grazie!

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

Non è consigliabile utilizzare il float dtype come indice, a volte può funzionare ma non è garantito. C'è un motivo per cui hai bisogno di fluttuare per l'indice? – EdChum

+0

Solo per comodità. Altrimenti ho bisogno di un altro array per registrare i valori - immagino che questo sia quello che devo fare. – user3821012

+0

Puoi sempre usare un moltiplicatore - per esempio, invece di 'np.arange (100) * 0.1', usa' np.arange (1000) ', poi correggi il moltiplicatore più avanti nel tuo codice. – MattDMo

risposta

0

Quale versione di Panda stai usando?

Per il documents:

Float64Index

Nota Come di 0.14.0, Float64Index è sostenuta da un nativo float64 DTYPE array. Prima di 0.14.0, Float64Index era supportato da un dtype array di oggetti . L'uso di un dattilografo float64 nel backend accelera le operazioni aritmetiche di di circa 30x e le operazioni di indicizzazione booleane su lo stesso Float64Index sono circa 2 volte più veloci. Novità nella versione 0.13.0.

In base all'impostazione predefinita, Float64Index verrà creato automaticamente quando si superano i valori fluttuanti floating o con valori interi misti nella creazione dell'indice. Questo abilita un paradigma di slicing puro basato su etichetta che rende [], ix, loc per l'indicizzazione scalare e il lavoro di slicing esattamente lo stesso.

+0

0.14.1, la versione più recente. – user3821012

+0

@ user3821012 la versione più recente è ora 0.16.0 – EdChum

Problemi correlati