Converti stringhe di numeri con virgole in panda DataFrame in float


92

Ho un DataFrame che contiene numeri come stringhe con virgole per l'indicatore delle migliaia. Devo convertirli in float.

a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)

Immagino di dover usare locale.atof. Infatti

df[0].apply(locale.atof)

funziona come previsto. Ottengo una serie di galleggianti.

Ma quando lo applico a DataFrame, ricevo un errore.

df.apply(locale.atof)

TypeError: ("impossibile convertire la serie in", u'occurred at index 0 ')

e

df[0:1].apply(locale.atof)

dà un altro errore:

ValueError: ('valore letterale non valido per float (): 1.200', u'occurred at index 0 ')

Quindi, come converto questo DataFramedi stringhe in un DataFrame di float?


2
Vecchia domanda, ma l'OP riceve applyquell'errore perché su un DataFrame passa un'intera colonna alla funzione come una serie (in questo caso locale.atof, che si aspetta una stringa). Se usi il applymapmetodo che fa @AndyHayden nella risposta qui sotto, dovresti essere in grado di farlo bene.
TC Proctor

Risposte:


149

Se stai leggendo da csv , puoi usare migliaia di arg :

df.read_csv('foo.tsv', sep='\t', thousands=',')

È probabile che questo metodo sia più efficiente rispetto all'esecuzione dell'operazione come passaggio separato.


Devi prima impostare le impostazioni internazionali :

In [ 9]: import locale

In [10]: from locale import atof

In [11]: locale.setlocale(locale.LC_NUMERIC, '')
Out[11]: 'en_GB.UTF-8'

In [12]: df.applymap(atof)
Out[12]:
      0        1
0  1200  4200.00
1  7000    -0.03
2     5     0.00

Avrei dovuto dire che ho impostato la localizzazione. Ricevo ancora l'errore.
pheon

2
Ma sto usando df.read_fwf, e anche questo ha l'opzione "migliaia = ','", che funziona. Grazie.
pheon

Poi di nuovo, perché df.applymap (atof) funziona per te ma non per me? La mia lingua è "en_US.UTF-8".
pheon

12
Ho votato questo per il suggerimento dell'argomento "migliaia" per la funzione read_csv. Ha funzionato benissimo per me.
rockfakie

4
Volevo aggiungere che puoi anche usare "decimal = ','" se hai a che fare con float.
VessoVit

34

Puoi utilizzare il metodo pandas.Series.str.replace :

df.iloc[:,:].str.replace(',', '').astype(float)

Questo metodo può rimuovere o sostituire la virgola nella stringa.


1
Ricevo "AttributeError: l'oggetto" DataFrame "non ha attributo" str "", non
ho

1
Ma funziona:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski

22

Puoi convertire una colonna alla volta in questo modo:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.