2016-02-05 22 views
5

Warum Pandas meine numpy float32 coerce in diesem Stück Code FLOAT64:Warum zwingt Pandas meine numpy float32 zu float64?

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame([[1, 2, 'a'], [3, 4, 'b']], dtype=np.float32) 
>>> A = df.ix[:, 0:1].values 
>>> df.ix[:, 0:1] = A 
>>> df[0].dtype 
dtype('float64') 

Das Verhalten scheint so seltsam für mich, dass Wunder, wenn es ein Fehler ist. Ich bin auf Pandas Version 0.17.1 (aktualisierte PyPI-Version) und ich stelle fest, dass es kürzlich erzwungene Fehler gab, siehe https://github.com/pydata/pandas/issues/11847. Ich habe den Code mit einem aktualisierten GitHub-Master nicht ausprobiert.

Ist es ein Fehler oder missverstand ich ein "Feature" in Pandas? Wenn es ein Feature ist, wie komme ich dann dazu?

(Die Nötigung Problem bezieht sich auf eine Frage, die ich vor kurzem über die Leistung von Pandas Zuweisungen gestellt: Assignment of Pandas DataFrame with float32 and float64 slow)

+0

Es mag seltsam sein, aber es ist konsistent mit numpy. Numpy wandelt gerade ganze Zahlen automatisch in numpy.float64-Typen um. Da Pandas im Kern über keine Funktionen verfügt, wird diese Funktionalität IMO erwartet (obwohl in Ihrem Fall sicherlich nicht ideal). – Benji

+0

Aber "Pandas" hat eine größere Neigung, "dtype = Objekt" als "numpy" zu verwenden. Es gibt ihm eine größere Flexibilität bei der Handhabung gemischter Typen - Zeichenfolgen können beliebig lang sein, Spalten können Typen mixen usw. Aber die Flexibilität kommt mit Rechen- und Speicherkosten. – hpaulj

Antwort

1

Ich denke, es lohnt sich dies als GitHub Ausgabe veröffentlichen. Das Verhalten ist sicherlich inkonsistent.

Der Code verwendet einen anderen Zweig basierend darauf, ob der DataFrame ein gemischter Typ ist oder nicht (source).

  • In dem Mischtyp der Fall ndarray Python zu einer Liste von float64 Zahlen umgewandelt wird, und dann zurück in float64 umgewandelt, um den Datenrahmen der Information dtypes (function maybe_convert_objects()) ndarray vernachlässigen.

  • Im nicht gemischten Fall wird der DataFrame-Inhalt ziemlich direkt aktualisiert (source) und der DataFrame behält seine float32-Dtypen.

+0

Ich habe ein neues Problem erstellt: https: // github.com/pydata/pandas/issues/12255 –

1

keine Antwort, aber meine Erholung des Problems:

In [2]: df = pd.DataFrame([[1, 2, 'a'], [3, 4, 'b']], dtype=np.float32) 
In [3]: df.dtypes 
Out[3]: 
0 float32 
1 float32 
2  object 
dtype: object 
In [4]: A=df.ix[:,:1].values 
In [5]: A 
Out[5]: 
array([[ 1., 2.], 
     [ 3., 4.]], dtype=float32) 
In [6]: df.ix[:,:1] = A 
In [7]: df.dtypes 
Out[7]: 
0 float64 
1 float64 
2  object 
dtype: object 
In [8]: pd.__version__ 
Out[8]: '0.15.0' 

ich mit pandas als numpy nicht so vertraut bin, aber ich bin verwirrt, warum ix[:,:1] gibt mir eine 2-Säule Ergebnis. In numpy diese Art der Indizierung gibt nur 1 Spalte.

Wenn ich eine einzelne Spalte dtype zuweisen nicht

In [47]: df.ix[:,[0]]=A[:,0] 
In [48]: df.dtypes 
Out[48]: 
0 float32 
1 float32 
2  object 
ändert

Die gleichen Aktionen ohne gemischte Datentypen nicht dtypes

In [100]: df1 = pd.DataFrame([[1, 2, 1.23], [3, 4, 3.32]], dtype=np.float32) 
In [101]: A1=df1.ix[:,:1].values 
In [102]: df1.ix[:,:1]=A1 
In [103]: df1.dtypes 
Out[103]: 
0 float32 
1 float32 
2 float32 
dtype: object 

Der Schlüssel sein muss, dass mit gemischten Werten ändert, Der Datenrahmen ist, in dem einen oder anderen Sinne, ein dtype=object Array, ob das für seinen internen Datenspeicher oder nur seinengiltSchnittstelle.

In [104]: df1.as_matrix() 
Out[104]: 
array([[ 1.  , 2.  , 1.23000002], 
     [ 3.  , 4.  , 3.31999993]], dtype=float32) 
In [105]: df.as_matrix() 
Out[105]: 
array([[1.0, 2.0, 'a'], 
     [3.0, 4.0, 'b']], dtype=object) 
+0

Zuordnung mit einer einzelnen Spalte und einem for-Schleife über Spaltennamen scheint eine angemessene Leistung für "innerhalb des Typs" (Nicht-Casting) Zuordnung und gibt den richtigen Typ. Allerdings ist diese Methode doppelt so langsam, wenn es von float32 und float64 geworfen wird. Ich vermute, mehrere Umteilungen würden das letztere Problem erklären. –