2015-03-24 22 views
5

Próbuję użyć liczby zmiennoprzecinkowej jako indeksu dla serii Panda, ale wydaje się, że nie działa ona prawidłowo. Na przykład w poniższym kodzie, gdy próbuję wywołać zasadę wartości [9.7], zwraca błąd. Uważam, że wynika to z faktu, że liczba zmiennoprzecinkowa 9.7 nie jest dokładnie przechowywana w komputerze jako 9.7 (np. 9.7000000001). Czy mimo to można to obejść? A może po prostu nie warto używać indeksu float?Indeks pływaka serii Pandas

Każde wejście jest bardzo doceniane. Dzięki!

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

Nie jest dobrym pomysłem użycie float dtype jako indeksu, czasami może działać, ale nie jest gwarantowane. Czy jest jakiś powód, dla którego potrzebujesz pływaka do indeksu? – EdChum

+0

Tylko dla wygody. W przeciwnym razie potrzebuję kolejnej tablicy do zapisania wartości - myślę, że to jest to, co muszę zrobić. – user3821012

+0

Zawsze możesz użyć mnożnika - na przykład zamiast 'np.arange (100) * 0.1', użyj' np.arange (1000) ', a następnie popraw mnożnik później w kodzie. – MattDMo

Odpowiedz

0

Która wersja Pandy używasz?

Per na documents:

Float64Index

Uwaga Począwszy od 0.14.0, Float64Index jest wspierany przez native float64 dtype tablicy. Przed wersją 0.14.0 obiekt Float64Index był wspierany przez tablicę obiektów obiektów typu . Użycie float64 dtype w backendach przyspiesza operacje arytmetyczne o około 30x i indeksowanie boolowskie na , ponieważ sam Float64Index jest około 2x tak szybki. Nowość w wersji 0.13.0.

Domyślnie wskaźnik Float64Index zostanie utworzony automatycznie po przekazaniu wartości zmiennej pływającej o wartości lub wartości zmiennoprzecinkowej w indeksie. Ten numer umożliwia stosowanie czystego, opartego na etykietach paradygmatu, który sprawia, że ​​skalarowanie i skalowanie [], ix, loc dla jest dokładnie takie samo.

+0

0.14.1, najnowsza wersja. – user3821012

+0

@ user3821012 Najnowsza wersja to teraz 0.16.0 – EdChum