Conversione di stringhe in float in un DataFrame


112

Come convertire una colonna DataFrame contenente stringhe e NaNvalori in float. E c'è un'altra colonna i cui valori sono stringhe e float; come convertire l'intera colonna in float.


7
NON USARE convert_objects. È deprecato. Usa to_numerico astypeinvece
Ted Petrou

Risposte:


72

NOTA: pd.convert_objects ora è stato deprecato. Dovresti usare pd.Series.astype(float)o pd.to_numericcome descritto in altre risposte.

Questo è disponibile in 0.11. Forza la conversione (o da set a nan) Funzionerà anche quando astypefallirà; è anche serie per serie, quindi non converte una colonna di stringhe completa

In [10]: df = DataFrame(dict(A = Series(['1.0','1']), B = Series(['1.0','foo'])))

In [11]: df
Out[11]: 
     A    B
0  1.0  1.0
1    1  foo

In [12]: df.dtypes
Out[12]: 
A    object
B    object
dtype: object

In [13]: df.convert_objects(convert_numeric=True)
Out[13]: 
   A   B
0  1   1
1  1 NaN

In [14]: df.convert_objects(convert_numeric=True).dtypes
Out[14]: 
A    float64
B    float64
dtype: object

Si prega di notare che questo non funziona per le colonne (a leadt multiindex), funziona solo per i valori nel dataframe
denfromufa

1
Ho dovuto usare set_levels per convertire la stringa in float
denfromufa

16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Puoi convertire solo una singola colonna.
Jack

19
questo ora è pd.to_numeric (col) nelle versioni più recenti
Jeff

11
convert_objects è deprecato nei panda più recenti. Utilizzare i convertitori specifici del tipo di dati pd.to_numeric.
Thomas Matthew

57

Puoi provare df.column_name = df.column_name.astype(float). Per quanto riguarda i NaNvalori, è necessario specificare come devono essere convertiti, ma è possibile utilizzare il .fillnametodo per farlo.

Esempio:

In [12]: df
Out[12]: 
     a    b
0  0.1  0.2
1  NaN  0.3
2  0.4  0.5

In [13]: df.a.values
Out[13]: array(['0.1', nan, '0.4'], dtype=object)

In [14]: df.a = df.a.astype(float).fillna(0.0)

In [15]: df
Out[15]: 
     a    b
0  0.1  0.2
1  0.0  0.3
2  0.4  0.5

In [16]: df.a.values
Out[16]: array([ 0.1,  0. ,  0.4])

47

In una versione più recente di panda (dalla 0.17 in su), puoi usare la funzione to_numeric . Ti consente di convertire l'intero dataframe o solo singole colonne. Ti dà anche la possibilità di selezionare come trattare le cose che non possono essere convertite in valori numerici:

import pandas as pd
s = pd.Series(['1.0', '2', -3])
pd.to_numeric(s)
s = pd.Series(['apple', '1.0', '2', -3])
pd.to_numeric(s, errors='ignore')
pd.to_numeric(s, errors='coerce')

32
Per applicare pd.to_numerica a DataFrame, si può usare df.apply(pd.to_numeric)quanto spiegato in dettaglio in questa risposta .
Ninjakannon

31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 

6
Questo non funziona quando si converte da una stringa a un float:ValueError: could not convert string to float: 'date'
Jack

@Jack conosci la soluzione alternativa qui? Sto riscontrando questo problema esatto convertendo la stringa in float.
Hatt

@ Hat sto affrontando lo stesso problema. hai trovato la soluzione per questo?
Prakhar Jhudele

@Jack Non ne sono sicuro, ma sembra che tu confonda il formato della data con il float. # convert to datetime df ['date'] = pd.to_datetime (df ['date'])
Claude COULOMBE

8

devi sostituire le stringhe vuote ('') con np.nan prima di convertire in float. vale a dire:

df['a']=df.a.replace('',np.nan).astype(float)

1

Ecco un esempio

                            GHI             Temp  Power Day_Type
2016-03-15 06:00:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:01:00 -7.99999952505459e-7    18.2    0   NaN
2016-03-15 06:02:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:03:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:04:00 -7.99999952505459e-7    18.3    0   NaN

ma se questi sono tutti valori stringa ... come nel mio caso ... Converti le colonne desiderate in float:

df_inv_29['GHI'] = df_inv_29.GHI.astype(float)
df_inv_29['Temp'] = df_inv_29.Temp.astype(float)
df_inv_29['Power'] = df_inv_29.Power.astype(float)

Il tuo dataframe ora avrà valori 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.