我是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'
已解决的问题: 看起来像是一些内部错误。重新启动机器并再次执行脚本解决了这个问题。
答案 0 :(得分: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'))