85 votes

LabelEncoder : TypeError : '>' non supporté entre les instances de 'float' et 'str'

Je suis confronté à cette erreur pour plusieurs variables, même en traitant les valeurs manquantes. Par exemple :

le = preprocessing.LabelEncoder()
categorical = list(df.select_dtypes(include=['object']).columns.values)
for cat in categorical:
    print(cat)
    df[cat].fillna('UNK', inplace=True)
    df[cat] = le.fit_transform(df[cat])
#     print(le.classes_)
#     print(le.transform(le.classes_))

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-424a0952f9d0> in <module>()
      4     print(cat)
      5     df[cat].fillna('UNK', inplace=True)
----> 6     df[cat] = le.fit_transform(df[cat].fillna('UNK'))
      7 #     print(le.classes_)
      8 #     print(le.transform(le.classes_))

C:\Users\paula.ceccon.ribeiro\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py in fit_transform(self, y)
    129         y = column_or_1d(y, warn=True)
    130         _check_numpy_unicode_bug(y)
--> 131         self.classes_, y = np.unique(y, return_inverse=True)
    132         return y
    133 

C:\Users\paula.ceccon.ribeiro\AppData\Local\Continuum\Anaconda3\lib\site-packages\numpy\lib\arraysetops.py in unique(ar, return_index, return_inverse, return_counts)
    209 
    210     if optional_indices:
--> 211         perm = ar.argsort(kind='mergesort' if return_index else 'quicksort')
    212         aux = ar[perm]
    213     else:

TypeError: '>' not supported between instances of 'float' and 'str'

La vérification de la variable à l'origine de l'erreur donne des résultats ins :

df['CRM do Médico'].isnull().sum()
0

En dehors des valeurs de nan, qu'est-ce qui pourrait provoquer cette erreur ?

151voto

sgDysregulation Points 2476

Ceci est dû à la série df[cat] contenant des éléments dont les types de données varient, par exemple (chaînes de caractères et/ou flottants). Cela peut être dû à la manière dont les données sont lues, c'est-à-dire que les nombres sont lus comme des flottants et le texte comme des chaînes, ou que le type de données était un flottant et qu'il a été modifié après l'introduction de l'élément de données. fillna opération.

En d'autres termes

Le type de données pandas 'Object' indique des types mixtes plutôt qu'un type str

en utilisant la ligne suivante :

df[cat] = le.fit_transform(df[cat].astype(str))

devrait aider

1 votes

C'est vraiment le cas. Vous savez pourquoi ? Je les lis déjà comme des str en utilisant les dtypes.

1 votes

C'est probablement lié à la définition d'un type d'objet dans pandas, le type d'objet ne signifie pas nécessairement dtype str. et pandas force le type à changer lorsqu'il insère des valeurs NaN.

1 votes

Qu'est-ce que le ? Quel paquet ?

8voto

Rutuja Points 11

Comme les types de données de type chaîne ont une longueur variable, ils sont par défaut stockés en tant que type d'objet. J'ai également rencontré ce problème après avoir traité les valeurs manquantes. La conversion de toutes ces colonnes en type "catégorie" avant l'encodage de l'étiquette a fonctionné dans mon cas.

df[cat]=df[cat].astype('category')

Puis vérifier df.dtypes et procéder à l'encodage des étiquettes.

2voto

Max Kleiner Points 39

Ou utiliser une coulée avec un type de corde fendue et uniforme.

unique, counts = numpy.unique(str(a).split(), return_counts=True)

0voto

lin sherry Points 1

Df['cat'] = df['cat'].apply(str) worked.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X