2016-02-12 23 views
23

Voglio cambiare l'indice (righe) di un dataframes da float64 a string o unicode.panda - cambia df.index da float64 a unicode o stringa

Ho pensato che questo avrebbe funzionato, ma a quanto pare non: messaggio

#check type 
type(df.index) 
'pandas.core.index.Float64Index' 

#change type to unicode 
if not isinstance(df.index, unicode): 
    df.index = df.index.astype(unicode) 

errore:

TypeError: Setting <class 'pandas.core.index.Float64Index'> dtype to anything other than float64 or object is not supported 

risposta

36

si può fare in questo modo:

# for Python 2 
df.index = df.index.map(unicode) 

# for Python 3 (the unicode type does not exist and is replaced by str) 
df.index = df.index.map(str) 

Per quanto riguarda il motivo per cui si dovrebbe procedere diversamente da quando convertirai da int a float, questa è una particolarità di numpy (la libreria su cui pandas si basa).

Ogni serie NumPy ha un DTYPE, che è sostanzialmente il macchina tipo dei suoi elementi: in questo modo, offerte NumPy direttamente con i tipi nativi, non con oggetti Python, che spiega come sia così veloce . Quindi quando cambi il dtype da int64 a float64, numpy getterà ogni elemento nel codice C.

C'è anche un dtype speciale: oggetto, che fondamentalmente fornisce un puntatore verso un oggetto Python.

Se si desidera utilizzare le stringhe, è necessario utilizzare l'oggetto dtype . Ma usare .astype(object) non ti darebbe la risposta che stavi cercando: avrebbe invece creato un indice con oggetto dtype, ma inserire oggetti float Python all'interno.

Qui, utilizzando carta, convertiamo l'indice per stringhe con l'apposita funzione: NumPy di ​​ottenere gli oggetti stringa e capire che l'indice deve avere un oggetto DTYPE, perché questo è l'unico DTYPE che può ospitare stringhe.

+0

Questo non funziona su Python 3.5. Hai qualche idea del perché? –

+2

Il poster originale stava usando Python 2. il tipo 'unicode' non esiste più in Python 3, e il tipo 'str' deve essere usato al suo posto (in pratica, ciò che veniva chiamato' str' in Python 2 è chiamato 'bytes' in Python 3 e 'unicode' sono diventati' str'). Vedere [questa domanda] (http://stackoverflow.com/questions/19877306/nameerror-global-name-unicode-is-not-defined-in-python-3) per ulteriori informazioni. – Arthur