web-dev-qa-db-fra.com

Convertir les chaînes de chiffres avec des virgules dans pandas DataFrame en float

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?

54
pheon

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
95
Andy Hayden

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.

19
shen ke

Vous pouvez convertir une colonne à la fois comme ceci:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
3
ghollah kioko