La colonne ne peut pas être convertie en type float=>NaNs

Bonjour,
J’ai un Data Frame à étudier dans le cadre de mon projet qui contient un colonne de type ‹ Object › que je voudrais convertir en ‹ float ›.
J’ai tout essayé mais à chaque fois ça me vide la colonne. J’ai donc la colonne en NaNs.
Avez vous une idée ?

Merci beaucoup
Virginie

Bonjour Virginie,

Etes-vous sûre que la colonne que vous essayez de convertir contient bien des éléments qui peuvent être représentés en tant que « float » ?

La commande est à priori df['a'] = df['a'].astype(float, errors = 'raise') où « a » est la colonne concernée.

Si vous avez un doute sur le format/sens des données n’hésitez pas à vous tourner vers les autres membres de votre groupe projet ou vers votre mentor.

En espérant avoir répondu à votre question,

Bonjour,

j’ai appliqué cette méthode et j’ai le message suivant alors que ma variable est bien un object

#TypeError: ‹ StringMethods › object is not callable

df[‹ variable ›] = df[‹ variable ›].str().astype(float).

Faut il remplacer les NaN par «  » avant ?

Bonjour Christine,

Il y a un .str() en trop dans ta commande !

df["variable"] = df["variable"].astype(float)

comme le suggérais Gaspard + éventuellement le paramètre errors suivant le comportement souhaité.

Noël

Bonjour Noel,

en enlevant le str(). J’ai un autre message d’erreur. J’ai inséré un exemple ci-dessous

import pandas as pd

data = {‹ CP ›:[‹ 38300 ›, ‹ 69000 ›, ‹ 75000 ›, ’ ']}
df = pd.DataFrame(data)
df.info()

df[« CP »].astype(float) → ValueError: could not convert string to float:

#Remplacer les vides par 0.0
df[‹ CP ›].replace({’ ':« 0.0 »},inplace =True)

semble fonctionner. Donc il faut que j’identifie en amont toutes les valeurs aberrantes possibles dans un gros fichier avant de convertir ?

Oui, Christine, c’est la procédure à suivre dans une approche data quality : d’abord identifier les anomalies, puis les nettoyer et enfin convertir le type de la colonne si nécessaire. Je dis bien si nécessaire car un code postal doit pour moi rester de type str (on ne fait aucun calcul sur un tel champ et dans certains pays il peut contenir autre chose que des chiffres).

En reprenant ton dernier exemple, la ligne suivante te donnera la liste des lignes dont le code postal n’est pas numérique :

df[df.CP.str.isdecimal()==False]

Dans une approche plus générique, on utiliserait une expression régulière pour vérifier également la longeur et d’autres règles de validation.

Tu peux également utiliser la suggestion de Gaspard avec le paramètre errors='raise' mais ceci t’indiquera la première ligne dans la liste où une erreur est rencontrée. Tu devrais répéter cela autant de fois qu’il y a de code postaux erronés. Mieux vaut en produire la liste directement comme ci-dessus.

Cordialement,

Noël

J’avoue me prendre les pieds dans la tapis car j’ai essayé avec un autre exemple de taux d’interêt de type object que je n’arrive pas à convertir en numérique car j’ai des " " ?

import pandas as pd

data = {‹ Taux ›:[‹ 4.39 ›, ‹ 0.0 ›, ‹ 17.34 ›,‹ 0.0 ›,‹ 13.75 ›,’ ']}
df = pd.DataFrame(data)
df.info()

df[‹ Taux ›].dtype
df[‹ Taux ›].astype(float,error=‹ raise ›)

ValueError: could not convert string to float:

Petit conseil : n’oublie pas de marquer ton code comme texte préformaté (icone </>), sinon les quote et double-quote sont transformés !

Même principe que ton problème précédent, ici tu dois d’abord détecter toutes les lignes dont le taux ne correspond pas à la représentation string d’un float puis décider de ce que tu fais avec (effacer la ligne, remplacer par un taux = '0', remplacer par la moyenne ou par le mode…).

Pour détecter ces lignes, il n’y a malhereusement pas de fonction isfloat(), mais tu peux l’implémenter comme ci-dessous puis appliquer une lambda sur la colonne (ou faire en sorte que isfloat() accepte une Series en argument).

def isfloat(element) :
    try:
        float(element)
        return True
    except ValueError:
        return False

Noël

P. S. Note que lors de l’import d’un CSV, le cas que tu donnes ne devrait pas se produire : la colonne serait float et les taux vides seraient des NaN. A vérifier !