2013-07-21 11 views
5

Podążałem za radą here, aby zmienić typ danych kolumny pandasowej. Wydaje się jednak, że nie działa, jeśli odwołuję się do kolumn według numerów indeksów zamiast nazw kolumn. Czy istnieje sposób, aby to zrobić poprawnie?Pandy: nie można zmienić typu danych kolumny

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

Odpowiedz

3

to zrobić następująco

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 

należy przypisać kolumny jeden po drugim

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 

przekształcenia obiektów zazwyczaj robi słusznie, tak najłatwiej zrobić to

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 

przypisywanie przez df.iloc[:,4:] z serią po prawej stronie kopiuje typ zmiany danych w razie potrzeby, więc myślę, że to powinno działać w teorii, ale podejrzewam, że jest to trafienie w bardzo niejasny błąd, który uniemożliwia zmianę obiektu dtype na prawdziwy (czyli int/float) dtype. Prawdopodobnie powinien się teraz podnieść.

Oto problem dotyczący śledzenia: https://github.com/pydata/pandas/issues/4312

Powiązane problemy