J'ai un DataFrame qui contient des nombres sous forme de chaînes avec des virgules pour le marqueur de milliers. J'ai besoin de les convertir en flotteurs.
a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)
Je suppose que je dois utiliser locale.atof. Effectivement
df[0].apply(locale.atof)
fonctionne comme prévu. Je reçois une série de chars.
Mais lorsque je l'applique à DataFrame, j'obtiens une erreur.
df.apply(locale.atof)
TypeError: ("ne peut pas convertir la série en", apparait à l'indice 0 ')
et
df[0:1].apply(locale.atof)
donne une autre erreur:
ValueError: ('littéral invalide pour float (): 1 200', induit à l'indice 0 ')
Alors, comment puis-je convertir ce DataFrame
de chaînes en un DataFrame de floats?
Si vous êtes lecture de csv alors vous pouvez utiliser le argument de milliers :
df.read_csv('foo.tsv', sep='\t', thousands=',')
Cette méthode sera probablement plus efficace que d'effectuer l'opération séparément.
Vous devez définir les paramètres régionaux d'abord:
In [ 9]: import locale
In [10]: from locale import atof
In [11]: locale.setlocale(locale.LC_NUMERIC, '')
Out[11]: 'en_GB.UTF-8'
In [12]: df.applymap(atof)
Out[12]:
0 1
0 1200 4200.00
1 7000 -0.03
2 5 0.00
Vous pouvez utiliser la méthode pandas.Series.str.replace :
df.iloc[:,:].str.replace(',', '').astype(float)
Cette méthode peut supprimer ou remplacer la virgule dans la chaîne.
Vous pouvez convertir une colonne à la fois comme ceci:
df['colname'] = df['colname'].str.replace(',', '').astype(float)