2013-03-04 9 views
36

Próbuję odczytać prosty plik oddzielony spacją przy użyciu metody pandy read_csv. Jednak pandy nie wydają się być posłuszne mojej argumentacji. Może błędnie to określam?Określanie dtype float32 z pandas.read_csv na pandach 0.10.1

Oddałem w dół moje nieco skomplikowane połączenie z read_csv tym prostym testowym pudełkiem. Używam argumentu converters w moim "prawdziwym" scenariuszu, ale usunąłem to dla uproszczenia.

Poniżej jest moje ipython sesja:

>>> cat test.out 
a b 
0.76398 0.81394 
0.32136 0.91063 
>>> import pandas 
>>> import numpy 
>>> x = pandas.read_csv('test.out', dtype={'a': numpy.float32}, delim_whitespace=True) 
>>> x 
     a  b 
0 0.76398 0.81394 
1 0.32136 0.91063 
>>> x.a.dtype 
dtype('float64') 

Próbowałem to również za pomocą tego z dtype z numpy.int32 lub numpy.int64. Te wybory spowodować wyjątek:

AttributeError: 'NoneType' object has no attribute 'dtype' 

Ja zakładając AttributeError dlatego pandy nie będzie automatycznie próbować nawracać/obciąć wartości pływaka do liczby całkowitej?

Używam 32-bitowego komputera z 32-bitową wersją Pythona.

>>> !uname -a 
Linux ubuntu 3.0.0-13-generiC#22-Ubuntu SMP Wed Nov 2 13:25:36 UTC 2011 i686 i686 i386 GNU/Linux 
>>> import platform 
>>> platform.architecture() 
('32bit', 'ELF') 
>>> pandas.__version__ 
'0.10.1' 
+0

myślę, że wygląda podobnie do [tej kwestii na github] (https://github.com/pydata/pandas/issues/2570) ... –

+0

@AndyHayden Myślę, że masz rację. Zagadnienie "AttributeError" jest dokładnie tym, o czym wspomina problem Github. Jednak w moim drugim scenariuszu wartości są zmiennymi, ale pandy nie przestrzegają argumentu 'dtype', gdy próbuję użyć float32 zamiast float64, itd. –

Odpowiedz

22

0.10.1 naprawdę nie obsługują float32 bardzo

zobaczyć http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#dtype-specification

można to zrobić w ten sposób: 0,11 jak

# dont' use dtype converters explicity for the columns you care about 
# they will be converted to float64 if possible, or object if they cannot 
df = pd.read_csv('test.csv'.....) 

#### this is optional and related to the issue you posted #### 
# force anything that is not a numeric to nan 
# columns are the list of columns that you are interesetd in 
df[columns] = df[columns].convert_objects(convert_numeric=True) 


    # astype 
    df[columns] = df[columns].astype('float32') 

see http://pandas.pydata.org/pandas-docs/dev/basics.html#object-conversion 

Its not as efficient as doing it directly in read_csv (but that requires 

I potwierdziły, że z 0.11-dev, TO DZIAŁA (na 32-bitowych i 64-bitowych, wyniki są takie same)

In [5]: x = pd.read_csv(StringIO.StringIO(data), dtype={'a': np.float32}, delim_whitespace=True) 

In [6]: x 
Out[6]: 
     a  b 
0 0.76398 0.81394 
1 0.32136 0.91063 

In [7]: x.dtypes 
Out[7]: 
a float32 
b float64 
dtype: object 

In [8]: pd.__version__ 
Out[8]: '0.11.0.dev-385ff82' 

In [9]: quit() 
[email protected]:~/pandas$ uname -a 
Linux precise32 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux 

some low-level changes) 
+0

Czy" astype "lub" convert_objects "będzie preferowanym sposobem to? –

+0

jeśli potrzebujesz specif dtype, a następnie użyj astype, convert_objects jest bardziej przeznaczone do konwersji z dtypes obiektów (i nie jest tak konieczne, jak w poprzednich wersjach) – Jeff

+1

Czy jest to uważane za błąd w pandach? Wydaje mi się to nieco mylące, że mogę przekazać 'dtype' i nie dostać tego, o co prosiłem, ani błędu, itp. –

7
In [22]: df.a.dtype = pd.np.float32 

In [23]: df.a.dtype 
Out[23]: dtype('float32') 

powyższe działa prawidłowo dla mnie pod pand 0.10.1

+1

fyi, jest to miejsce docelowe (co jest niejawne) i nie jest bezpieczne w przypadku danych niewypełnionych – Jeff

+0

@Jeff Tak, jest to właściwość rzutowania w miejscu i nie jest bezpieczna dla wartości niepustych. – pravin

+0

'df = pd.read_csv ('sample. out ', konwertery = {' a ': lambda x: pd.np.float32 (x)}, delim_whitespace = True) 'również nie działa. – pravin

Powiązane problemy