2013-07-21 12 views
5

Stavo seguendo il consiglio here per modificare il tipo di dati di colonna di un dataframe panda. Tuttavia, non sembra funzionare se faccio riferimento alle colonne per numero di indice anziché per nome di colonna. C'è un modo per farlo correttamente?Panda: impossibile modificare il tipo di dati di colonna

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]: 

risposta

3

fare in questo modo

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 

necessario assegnare le colonne 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 

convertire gli oggetti di solito fa la cosa giusta, in modo più semplice per farlo

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 

assegnazione tramite df.iloc[:,4:] con una serie sul lato destro copia il tipo di modifica dei dati secondo necessità, quindi penso che questo dovrebbe funzionare in teoria, ma sospetto che questo stia colpendo un bug molto oscuro che impedisce al dtype dell'oggetto di passare a reale (che significa int/float) dtype. Probabilmente dovrebbe rilanciare per ora.

Ecco il problema per tenere traccia di questo: https://github.com/pydata/pandas/issues/4312

Problemi correlati