sklearn.preprocessing.LabelEncoder 数据集上的TypeError
这里有14列数据,大约有1,011,052行。在读取CSV文件时,大约跳过了十行,出现的错误是:数据解析错误。C错误:在第<...>行预期有14个字段,但看到了15个字段。为了将字符串转换为浮点数,以便在scikit-learn.fit(...)
中使用,使用了data.apply(LabelEncoder().fit_transform)
。在这里建议使用data.apply(LabelEncoder().fit_transform)
(https://stackoverflow.com/a/31939145/2178774)。(编辑:注意670是第一个值。)
data = pd.read_csv('./dm.csv',error_bad_lines=False)
print(X.shape,y.shape)
(1011052, 13) (1011052, 1)
data.apply(LabelEncoder().fit_transform)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-18-9734848fb589> in <module>()
19 # y is now: array([2, 0, 1, 3, 2, 0, 1, 3])
20
---> 21 data.apply(LabelEncoder().fit_transform)
22 # TypeError: ("'>' not supported between instances of 'int' and 'str'", 'occurred at index 670')
23
/usr/lib64/python3.6/site-packages/pandas/core/frame.py in apply(self, func, axis, broadcast, raw, reduce, args, **kwds)
4358 f, axis,
4359 reduce=reduce,
-> 4360 ignore_failures=ignore_failures)
4361 else:
4362 return self._apply_broadcast(f, axis)
/usr/lib64/python3.6/site-packages/pandas/core/frame.py in _apply_standard(self, func, axis, ignore_failures, reduce)
4454 try:
4455 for i, v in enumerate(series_gen):
-> 4456 results[i] = func(v)
4457 keys.append(v.name)
4458 except Exception as e:
/usr/lib64/python3.6/site-packages/sklearn/preprocessing/label.py in fit_transform(self, y)
110 """
111 y = column_or_1d(y, warn=True)
--> 112 self.classes_, y = np.unique(y, return_inverse=True)
113 return y
114
/usr/lib64/python3.6/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 'int' and 'str'", 'occurred at index 670')
编辑:
在read_csv
时,出现了以下输出:
/usr/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2717: DtypeWarning: 列(0)有混合类型。导入时请指定dtype选项或设置low_memory=False。
interactivity=interactivity, compiler=compiler, result=result)
编辑:
在read_csv
中添加了dtype={...},现在出现了类型错误:TypeError: ("'>'不支持在'str'和'int'实例之间使用", '发生在索引0')
。
data = pd.read_csv('./dm.csv',error_bad_lines=False,header=None,dtype={
0: np.dtype('u8'), # 64-bit unsigned integer
1: np.dtype('u4'), # 32-bit unsigned integer
2: np.dtype('U'), # unicode
3: np.dtype('U'), # unicode
4: np.dtype('U'), # unicode
5: np.dtype('U'), # unicode
6: np.dtype('u2'), # 16-bit unsigned integer
7: np.dtype('U'), # unicode
8: np.dtype('U'), # unicode
9: np.dtype('f2'), # 16-bit floating point
10:np.dtype('U'), # unicode
11:np.dtype('U'), # unicode
12:np.dtype('f4'), # 32-bit floating point
13:np.dtype('U') # unicode
})
编辑: 当使用两行数据时发生类型错误。错误出现在第八列。第一行第八列是"GHI789",第二行第八列是"NaN"。
X = data.iloc[0:2,0:14]
print(X)
print('--------')
for col in X.columns:
print(col)
print(X.dtypes[col])
if X.dtypes[col] == "object":
le = LabelEncoder()
le.fit_transform(X[col])
X[col] = le.transform(X[col])
输出:
0 1 2 \
0 100 138.0 2017-12-31
1 101 13.0 2017-12-31
3 4 \
0 Title1 ABC123
1 Title2 ABC123
5 6 7 \
0 User1 0.0 DEF456
1 User2 0.0 DEF456
8 9 10 \
0 GHI789 0.0 XYZ123
1 NaN 0.0 XYZ123
11 12 13
0 Title11 0.0 NaN
1 Title22 0.0 NaN
--------
0
object
1
float64
2
object
3
object
4
object
5
object
6
float64
7
object
8
object
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-70-c94173863fd7> in <module>()
29 if X.dtypes[col] == "object":
30 le = LabelEncoder()
---> 31 le.fit_transform(X[col])
32 X[col] = le.transform(X[col])
/usr/lib64/python3.6/site-packages/sklearn/preprocessing/label.py in fit_transform(self, y)
110 """
111 y = column_or_1d(y, warn=True)
--> 112 self.classes_, y = np.unique(y, return_inverse=True)
113 return y
114
/usr/lib64/python3.6/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'
编辑: 解决方案?: "NaN"与字符串混合是个问题。解决办法是将"NaN"替换为空字符串。比如:data = data.replace(np.nan, '', regex=True)
。
编辑: 我刚注意到第9列有两个问题。第一:大约有两百行是空字符串,导致了字符串与浮点数的问题。第二:还有一大部分是字符串"0",被解析为整数或字符串,这又导致了字符串与浮点数的问题。在第二种情况下,解决办法是执行以下操作:data[9] = data[9].replace('^0$', 0.0, regex=True)
。
相关问题:
- 暂无相关问题
2 个回答
我也遇到过同样的问题,但别人给的解决办法并没有解决错误。我找到的解决方法是先把这一列的数据转换成字符串类型:train[col] = train[col].astype('str'),然后再使用LabelEncoder。这样做可以让所有的数据类型统一,避免出现错误。我觉得甚至不需要去处理那些缺失值(NaNs)。
if train[col].dtype == 'object':
train[col] = train[col].fillna(train[col].mode().iloc[0])
你可以用这一列的平均值来替换这些类型的NaN值。我觉得这样可以解决这个错误。