web-dev-qa-db-fra.com

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

Je suis confronté à cette erreur pour plusieurs variables même en traitant des 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'

Vérification de la variable qui a entraîné les résultats d'erreur dans:

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

Outre les valeurs nan, quelle pourrait être la cause de cette erreur?

29
pceccon

Cela est dû à la série df[cat] contenant des éléments ayant différents types de données (par exemple, des chaînes et/ou des éléments flottants). Cela peut être dû à la façon dont les données sont lues, c'est-à-dire que les nombres sont lus en tant que float et que le texte est en tant que chaînes ou que le type de données était float et modifié après l'opération fillna.

En d'autres termes 

le type de données pandas 'Object' indique des types mixtes plutôt que des types str

donc en utilisant la ligne suivante:

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


devrait aider

70
sgDysregulation

Comme les types de données de chaîne ont une longueur variable, il est stocké par défaut en tant que type d'objet. J'ai fait face à ce problème après avoir traité les valeurs manquantes aussi. La conversion de toutes ces colonnes en type 'catégorie' avant le codage d'étiquette a fonctionné dans mon cas.

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

Et puis vérifiez df.dtypes et effectuez le codage d'étiquette.

1
Rutuja

Ou utilisez un modèle avec un type de corde uniforme

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