LabelEncoder: TypeError: ‘>’ niet ondersteund tussen instanties van ‘float’ en ‘str’

Ik heb te maken met deze fout voor meerdere variabelen, zelfs als ik ontbrekende waarden behandel.
Bijvoorbeeld:

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'

Het controleren van de variabele die tot de fout leidde, resulteert in:

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

Naast nan-waarden, wat zou deze fout kunnen veroorzaken?


Antwoord 1, autoriteit 100%

Dit komt door de reeks df[cat]die elementen bevat die verschillende datatypes hebben, bijvoorbeeld (strings en/of floats). Dit kan te wijten zijn aan de manier waarop de gegevens worden gelezen, d.w.z. getallen worden gelezen als zwevend en tekst als tekenreeksen of het gegevenstype is zwevend en gewijzigd na de bewerking fillna.

Met andere woorden

panda’s-gegevenstype ‘Object’ geeft gemengde typen aan in plaats van str-type

dus gebruik de volgende regel:

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

zou moeten helpen


Antwoord 2, autoriteit 6%

Omdat stringgegevenstypen een variabele lengte hebben, wordt deze standaard opgeslagen als objecttype. Ik kreeg met dit probleem te maken nadat ik ook ontbrekende waarden had behandeld. Het converteren van al die kolommen naar het type ‘categorie’ voordat labelcodering werkte in mijn geval.

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

En controleer dan df.dtypes en voer labelcodering uit.


Antwoord 3

Of gebruik een cast met split tot uniform type str

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

Other episodes