2013-07-21 16 views
5

Ich folgte dem Ratschlag here, um den Spaltendatentyp eines Pandas Datenrahmens zu ändern. Es scheint jedoch nicht zu funktionieren, wenn ich die Spalten anhand von Indexnummern anstelle von Spaltennamen referenziere. Gibt es eine Möglichkeit, dies richtig zu machen?Pandas: Spalten Datentyp nicht ändern

In [49]: df.iloc[:, 4:].astype(int) 
Out[49]: 
&ltclass 'pandas.core.frame.DataFrame'&gt 
Int64Index: 5074 entries, 0 to 5073 
Data columns (total 3 columns): 
5 5074 non-null values 
6 5074 non-null values 
7 5074 non-null values 
dtypes: int64(3) 

In [50]: df.iloc[:, 4:] = df.iloc[:, 4:].astype(int) 

In [51]: df 
Out[51]: 
&ltclass 'pandas.core.frame.DataFrame'&gt 
Int64Index: 5074 entries, 0 to 5073 
Data columns (total 7 columns): 
1 5074 non-null values 
2 5074 non-null values 
3 5074 non-null values 
4 5074 non-null values 
5 5074 non-null values 
6 5074 non-null values 
7 5074 non-null values 
dtypes: object(7) 

In [52]: 

Antwort

3

es gefällt das

In [49]: df = DataFrame([['1','2','3','.4',5,6.,'foo']],columns=list('ABCDEFG')) 

In [50]: df 
Out[50]: 
    A B C D E F G 
0 1 2 3 .4 5 6 foo 

In [51]: df.dtypes 
Out[51]: 
A  object 
B  object 
C  object 
D  object 
E  int64 
F float64 
G  object 
dtype: object 

benötigen Spalten one-by-one

In [52]: for k, v in df.iloc[:,0:4].convert_objects(convert_numeric=True).iteritems(): 
    df[k] = v 
    ....:  

In [53]: df.dtypes 
Out[53]: 
A  int64 
B  int64 
C  int64 
D float64 
E  int64 
F float64 
G  object 
dtype: object 

Objekte zuweisen Konvertieren in der Regel das Richtige tut, so am einfachsten diese

zu tun
In [54]: df = DataFrame([['1','2','3','.4',5,6.,'foo']],columns=list('ABCDEFG')) 

In [55]: df.convert_objects(convert_numeric=True).dtypes 
Out[55]: 
A  int64 
B  int64 
C  int64 
D float64 
E  int64 
F float64 
G  object 
dtype: object 

Zuweisung über df.iloc[:,4:] mit einer Reihe auf der rechten Seite kopiert die Daten ändernden Typ nach Bedarf, so denke ich, dass dies in der Theorie funktionieren sollte, aber ich vermute, dass dies einen sehr obskuren Fehler trifft, der verhindert, dass das Objekt dtype zu einem real real (Bedeutung int/float) dtype. Sollte wahrscheinlich für jetzt erhöhen.

Heres das Problem, das zu verfolgen: https://github.com/pydata/pandas/issues/4312