添加额外操作时,'str'和'float'实例之间不支持TypeError:'>'

问题描述 投票:0回答:1

我是Python for Machine Learning中的数据预处理新手。我正在尝试预处理一些数据。数据由许多分类变量组成,其中包含一些空和NaN条目。我正在使用ffil方法填充空或NaN空间,然后使用sklearn LabelEncoder和后来的单热编码进行标签编码。我有两个不同的代码段。第一个是更简单的做标签编码没有错误,但在第二种情况下几乎没有附加进程我得到上述错误:第一个代码部分:

encoder = LabelEncoder()
for cols in train.keys():
    if(cols.startswith('cat')):
        train[cols].fillna(method='ffill', inplace=True)
        train[cols].fillna(method='bfill', inplace=True)
        if train[cols].dtype == 'object':
            train[cols] = encoder.fit_transform(train[cols])
            train = pd.get_dummies(data=train, columns=[cols])

第二个代码部分:

encoder = LabelEncoder()
best_fit = SelectKBest(score_func=chi2, k=10)
for cols in train.keys():
    if(cols.startswith('cat')):
        train[cols].fillna(method='ffill', inplace=True)
        train[cols].fillna(method='bfill', inplace=True)
        if train[cols].dtype == 'object':
            train[cols] = encoder.fit_transform(train[cols])
            train_temp = pd.get_dummies(data=train, columns=[cols])
            temp_df = train_temp[list(set(train_temp.keys())-set(train.keys()))]
            fit_temp = best_fit.fit(temp_df, target)
            features_temp = fit_temp.transform(temp_df)
            train = train.drop([cols], axis=1)
            train = pd.concat([train, pd.DataFrame(features_temp)], axis = 1, join='outer')

Traceback日志:

Traceback (most recent call last):

  File "<ipython-input-1-4efe4593ba69>", line 37, in <module>
    train[cols] = encoder.fit_transform(train[cols])

  File "C:\Continuum\anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 112, in fit_transform
    self.classes_, y = np.unique(y, return_inverse=True)

  File "C:\Continuum\anaconda3\lib\site-packages\numpy\lib\arraysetops.py", line 211, in unique
    perm = ar.argsort(kind='mergesort' if return_index else 'quicksort')

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

已解决的问题:看起来像是一些内部错误。重新启动计算机并再次执行脚本解决了这个问题。

python pandas numpy dataframe encoding
1个回答
1
投票

发生此错误的原因是,数据在传递给编码器时必须具有统一的数据类型,即在将列传递给编码器时将列转换为一个dtype。

from sklearn import preprocessing
encoder = preprocessing.LabelEncoder()

df = pd.DataFrame({'a':[1,2,3,'NAN','4']})

encoder.fit_transform(df['a'].astype(str))
#or if you have only numerical datatype then
#encoder.fit_transform(pd.to_numeric(df['a'],errors='coerce'))
© www.soinside.com 2019 - 2024. All rights reserved.