Conversion de chaînes en flottants dans un DataFrame


113

Comment convertir une colonne DataFrame contenant des chaînes et des NaNvaleurs en flottants. Et il y a une autre colonne dont les valeurs sont des chaînes et des flottants; comment convertir toute cette colonne en flottants.


7
NE PAS UTILISER convert_objects. Il est obsolète. Utiliser to_numericou à la astypeplace
Ted Petrou

Réponses:


72

REMARQUE: pd.convert_objects est désormais obsolète. Vous devez utiliser pd.Series.astype(float)ou pd.to_numericcomme décrit dans les autres réponses.

Ceci est disponible en 0.11. Conversion de forces (ou mise en nan) Cela fonctionnera même en cas d' astypeéchec; il est également série par série, donc il ne convertit pas, disons une colonne de chaîne complète

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

Veuillez noter que cela ne fonctionne pas pour les colonnes (chez leadt multiindex), ne fonctionne que pour les valeurs dans le dataframe
denfromufa

1
J'ai dû utiliser set_levels pour convertir une chaîne en float
denfromufa

16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Vous ne pouvez convertir qu'une seule colonne.
Jack

19
c'est maintenant pd.to_numeric (col) dans les versions plus récentes
Jeff

11
convert_objects est obsolète dans les pandas plus récents. Utilisez les convertisseurs spécifiques au type de données pd.to_numeric.
Thomas Matthew

58

Vous pouvez essayer df.column_name = df.column_name.astype(float). En ce qui concerne les NaNvaleurs, vous devez spécifier comment elles doivent être converties, mais vous pouvez utiliser la .fillnaméthode pour le faire.

Exemple:

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

Dans une version plus récente de pandas (0.17 et plus), vous pouvez utiliser la fonction to_numeric . Il vous permet de convertir le dataframe entier ou seulement des colonnes individuelles. Il vous donne également la possibilité de sélectionner la manière de traiter les éléments qui ne peuvent pas être convertis en valeurs numériques:

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
Pour postuler pd.to_numericà un DataFrame, on peut utiliser df.apply(pd.to_numeric)comme expliqué en détail dans cette réponse .
Ninjakannon

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

6
Cela ne fonctionne pas lors de la conversion d'une chaîne à un flotteur:ValueError: could not convert string to float: 'date'
Jack

@Jack connaissez-vous la solution de contournement ici? Je rencontre ce problème exact de conversion de chaîne en flottant.
Hatt le

@Hatt je suis confronté au même problème. avez-vous trouvé la solution?
Prakhar Jhudele

@Jack Je ne suis pas sûr mais vous semblez mélanger le format de date et le flottant. # convert to datetime df ['date'] = pd.to_datetime (df ['date'])
Claude COULOMBE

8

vous devez remplacer les chaînes vides ('') par np.nan avant de convertir en float. c'est à dire:

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

1

Voici un exemple

                            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

mais si ce sont toutes des valeurs de chaîne ... comme c'était dans mon cas ... Convertissez les colonnes souhaitées en flottants:

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)

Votre dataframe aura désormais des valeurs flottantes :-)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.