web-dev-qa-db-fra.com

Conversion de chaînes en caractères flottants dans un DataFrame

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.

101
Neer

NOTE:pd.convert_objects est maintenant obsolète. Vous devez utiliser pd.Series.astype(float) ou pd.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
68
Jeff

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])
46
root

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')
43
Salvador Dali
df['MyColumnName'] = df['MyColumnName'].astype('float64') 
28
Claude COULOMBE

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)
4
Paul Mwaniki

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 :-)

1
ArmandduPlessis