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.
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
01.01.011 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
01111NaNIn[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
00.10.21NaN0.320.40.5In[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
00.10.210.00.320.40.5In[16]: df.a.values
Out[16]: array([0.1,0.,0.4])
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')
convert_objects
. Il est obsolète. Utiliserto_numeric
ou à laastype
placeRé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ètela source
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)
Vous ne pouvez convertir qu'une seule colonne.Vous pouvez essayer
df.column_name = df.column_name.astype(float)
. En ce qui concerne lesNaN
valeurs, vous devez spécifier comment elles doivent être converties, mais vous pouvez utiliser la.fillna
méthode pour le faire.Exemple:
la source
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:
la source
pd.to_numeric
à unDataFrame
, on peut utiliserdf.apply(pd.to_numeric)
comme expliqué en détail dans cette réponse .la source
ValueError: could not convert string to float: 'date'
vous devez remplacer les chaînes vides ('') par np.nan avant de convertir en float. c'est à dire:
la source
Voici un exemple
mais si ce sont toutes des valeurs de chaîne ... comme c'était dans mon cas ... Convertissez les colonnes souhaitées en flottants:
Votre dataframe aura désormais des valeurs flottantes :-)
la source