web-dev-qa-db-fra.com

Impossible de convertir une chaîne en flottant dans pandas (ValueError)

J'ai créé une trame de données à partir d'une sortie JSON qui ressemble à ceci:

        Total Revenue    Average Revenue    Purchase count    Rate
Date    
Monday  1,304.40 CA$     20.07 CA$          2,345             1.54 %

La valeur stockée est reçue sous forme de chaîne à partir du JSON. J'essaie de:

1) Supprimez tous les caractères de l'entrée (ex: $ CA ou%) 2) convertissez les colonnes de taux et de revenus en flottant 3) Convertissez les colonnes de comptage en int

J'ai essayé de faire ce qui suit:

df[column] = (df[column].str.split()).apply(lambda x: float(x[0]))

Cela fonctionne bien sauf lorsque j'ai une valeur avec un coma (ex: 1 465 ne fonctionnera pas alors que 143 le ferait).

J'ai essayé d'utiliser plusieurs fonctions pour remplacer le "," par "", etc. Rien n'a fonctionné jusqu'à présent. Je reçois toujours l'erreur suivante:

ValueError: impossible de convertir la chaîne en float: '1,304.40'

5
John_Mtl

Ces chaînes ont des virgules comme milliers de séparateurs, vous devrez donc les supprimer avant l'appel à float:

df[column] = (df[column].str.split()).apply(lambda x: float(x[0].replace(',', '')))

Cela peut être un peu simplifié en déplaçant split à l'intérieur de lambda:

df[column] = df[column].apply(lambda x: float(x.split()[0].replace(',', '')))
3
DeepSpace

Une autre solution avec list compréhension, si besoin applique stringfonctions fonctionnant uniquement avec Series (colonnes de DataFrame) comme - str.split et str.replace :

df = pd.concat([df[col].str.split()
                       .str[0]
                       .str.replace(',','').astype(float) for col in df], axis=1)

#if need convert column Purchase count to int
df['Purchase count'] = df['Purchase count'].astype(int)
print (df)
         Total Revenue  Average Revenue  Purchase count  Rate
Date                                                        
Monday         1304.4            20.07            2345  1.54
1
jezrael