2014-04-18 20 views
7

Sono un po 'confuso con il tipo di dati "oggetto" in Panda. Che cosa è esattamente "oggetto"?Converti float in stringa in panda

Vorrei cambiare la variabile "SpT" (vedi sotto) da oggetto a stringa.

> df_cleaned.dtypes 
    Vmag  float64 
    RA   float64 
    DE   float64 
    Plx   float64 
    pmRA  float64 
    pmDE  float64 
    B-V   float64 
    SpT   object 
    M_V   float64 
    distance float64 
    dtype: object 

Per questo faccio la seguente:

df_cleaned['SpT'] = df_cleaned['SpT'].astype(str) 

Ma questo non ha alcun effetto sulla DTYPE di SPT.

Il motivo per fare è quando faccio la seguente:

f = lambda s: (len(s) >= 2) and (s[0].isalpha()) and (s[1].isdigit()) 
i = df_cleaned['SpT'].apply(f) 
df_cleaned = df_cleaned[i] 

ottengo:

TypeError: object of type 'float' has no len() 

Quindi, credo che se converto "oggetto" a "String", mi metterò fare ciò che voglio

Maggiori informazioni: Questo è come SPT assomiglia:

HIP 
1    F5 
2    K3V 
3    B9 
4    F0V 
5    G8III 
6    M0V: 
7    G0 
8  M6e-M8.5e Tc 
9    G5 
10    F6V 
11    A2 
12   K4III 
13   K0III 
14    K0 
15    K2 
... 
118307 M2III: 
118308  K: 
118309  A2 
118310  K5 
118312  G5 
118313  F0 
118314  K0 
118315  K0III 
118316  F2 
118317  F8 
118318  K2 
118319  G2V 
118320  K0 
118321  G5V 
118322  B9IV 
Name: SpT, Length: 114472, dtype: object 
+0

Il 'dtype' è un dtype numerico generico per tipi non interi, questo suggerisce che la tua colonna è già una stringa e sicuramente è dopo la conversione quindi il problema sta nella tua funzione – EdChum

+0

Nope , la funzione è corretta. La risposta qui sotto mi ha aiutato. Grazie comunque! – Rohit

+0

@aging_gorrila Quale versione di panda stai usando? –

risposta

11

Se una colonna contiene la stringa o viene trattato come stringa, avrà una dtype di object (ma non necessariamente vero indietro - più in basso) . Ecco un semplice esempio:

import pandas as pd 
df = pd.DataFrame({'SpT': ['string1', 'string2', 'string3'], 
        'num': ['0.1', '0.2', '0.3'], 
        'strange': ['0.1', '0.2', 0.3]}) 
print df.dtypes 
#SpT  object 
#num  object 
#strange object 
#dtype: object 

Se una colonna contiene solo le stringhe, possiamo applicare len su di esso come quello che hai fatto dovrebbe funzionare bene:

print df['num'].apply(lambda x: len(x)) 
#0 3 
#1 3 
#2 3 

Tuttavia, un dtype di oggetto non fa mezzi contiene solo stringhe. Ad esempio, la colonna strange contiene oggetti con tipi misti - e alcuni str e uno float. Applicando la funzione len si genera un errore simile a quello che avete visto:

print df['strange'].apply(lambda x: len(x)) 
# TypeError: object of type 'float' has no len() 

Quindi, il problema potrebbe essere che non è stato convertito correttamente la colonna a stringa, e la colonna contiene ancora tipi di oggetti misti.

Continuando l'esempio precedente, cerchiamo di convertire strange in stringhe e controllare se apply opere:

df['strange'] = df['strange'].astype(str) 
print df['strange'].apply(lambda x: len(x)) 
#0 3 
#1 3 
#2 3 

(C'è una discrepanza sospetta tra il df_cleaned e df_clean c'è nella tua domanda, si tratta di un errore di battitura o di un errore nel codice che causa il problema?)

+0

Grazie per aver chiarito questo. Il punto è che il comando di conversione "df_cleaned ['SpT'] = df_cleaned ['SpT']. Astype (str)" non ha alcun effetto. Continuo a ottenere lo stesso errore. Come posso assicurarmi che tutti i 114000 valori siano stati convertiti in stringa? Sì, c'è un errore di battitura. L'ho corretto – Rohit

+0

Credo che '' df_cleaned ['SpT'] = df_cleaned ['SpT']. Astype (str) '' avrà eseguito correttamente la conversione. Stai applicando la funzione esatta come descritto nella tua domanda? –

+0

Duh! Ho seriamente bisogno di scegliere nomi di variabili migliori! Questi confondono anche me stesso! Sì, stavo applicando a una variabile sbagliata! Grazie ... ho bisogno di un caffè! – Rohit