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.

Neer
la source
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
Jeff
la source
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])
racine
la source
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')
Salvador Dali
la source
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') 
Claude COULOMBE
la source
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)
Paul Mwaniki
la source
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 :-)

ArmandduPlessis
la source