Comment convertir une colonne DataFrame contenant des chaînes et des valeurs NaN
en floats. Et il y a une autre colonne dont les valeurs sont les chaînes et les flottants; comment convertir cette colonne entière en float.
NOTE:
pd.convert_objects
est maintenant obsolète. Vous devez utiliserpd.Series.astype(float)
oupd.to_numeric
comme décrit dans d'autres réponses.
Ceci est disponible dans 0.11. Force la conversion (ou la définition en nan) Cela fonctionnera même lorsque astype
échouera; sa aussi série par série afin qu'il ne convertira pas dire 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
Vous pouvez essayer df.column_name = df.column_name.astype(float)
. En ce qui concerne les valeurs NaN
, vous devez spécifier comment elles doivent être converties, mais vous pouvez utiliser la méthode .fillna
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])
Dans une version plus récente de pandas (0.17 et plus), vous pouvez utiliser la fonction to_numeric . Il vous permet de convertir l’ensemble du cadre de données ou seulement des colonnes individuelles. Cela vous donne également la possibilité de choisir comment traiter les choses qui ne peuvent pas être converties 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')
df['MyColumnName'] = df['MyColumnName'].astype('float64')
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)
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 s'il s'agit de toutes les valeurs de chaîne ... comme dans mon cas ... Convertissez les colonnes souhaitées en floats:
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 maintenant des valeurs float :-)