web-dev-qa-db-ja.com

LabelEncoder:TypeError: '>'は 'float'と 'str'のインスタンス間ではサポートされていません

欠損値を処理する場合でも、複数の変数に対してこのエラーに直面しています。例えば:

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'

エラーの原因となる変数を確認すると、次の結果が得られます。

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

Nan値のほかに、このエラーの原因は何ですか?

40
pceccon

これは、一連のdf[cat]がさまざまなデータ型(たとえば、文字列や浮動小数点数)を持つ要素を含むためです。これは、データの読み取り方法が原因である可能性があります。つまり、数値がフロートとして読み取られ、テキストが文字列として読み取られるか、データ型がフロートでfillna操作後に変更されました。

言い換えると

パンダのデータ型「オブジェクト」は、str型ではなく混合型を示します

そのため、次の行を使用します。

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


助けてください

94
sgDysregulation

文字列データ型には可変長があるため、デフォルトではオブジェクト型として保存されます。欠損値も処理した後、この問題に直面しました。私の場合、ラベルのエンコードが機能する前に、これらすべての列を「category」と入力するように変換します。

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

そして、df.dtypesを確認し、ラベルエンコーディングを実行します。

2
Rutuja

または、均一型のstrに分割してキャストする

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