类型错误:参数必须是字符串或数字。

4

我正在使用以下代码:

cat_cols = ['MSZoning','Alley','LotShape','LandContour','Utilities','LotConfig','LandSlope','Neighborhood','Condition1','Condition2','BldgType','HouseStyle','RoofStyle','RoofMatl','Exterior1st','Exterior2nd','MasVnrType','ExterQual','ExterCond','Foundation','BsmtQual','BsmtCond','BsmtExposure','BsmtFinType1','BsmtFinType2','Heating','HeatingQC','CentralAir','Electrical','KitchenQual','Functional','FireplaceQu','GarageType','GarageFinish','GarageQual','GarageCond','PavedDrive','PoolQC','Fence','MiscFeature','SaleType','SaleCondition']

from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()

for col in cat_cols:
    if col in dataset_train.columns:
        i = dataset_train.columns.get_loc(col)
        dataset_train.iloc[:,i] =le.fit_transform(dataset_train.iloc[:,i])

它会出现以下错误:
TypeError:参数必须是字符串或数字。

2
请始终将完整的错误消息(从“Traceback”一词开始)作为文本(而不是屏幕截图)放在问题中(而不是评论),因为还有其他有用的信息。 - furas
如果出现错误显示“参数必须是字符串或数字”,那么请检查您的变量中有什么。 - furas
如果单元格中有例如list,我就会遇到这个错误 - 例如dataset_train = pd.DataFrame({'Alley':[['A','B','C']]}) - 因此在某些列中,您可能有无法编码的值 - 您至少可以使用print(col)来查看哪一列出现了问题。 - furas
顺便说一句:对于每一列,您应该创建单独的“LabelEncoder” - 如果您将相同的“LabelEncoder”用于两个列,则会删除旧值,并且无法使用它将列编码回原始值。 - furas
看起来这个问题在这里得到了更好的回答:SciKit-Learn标签编码器导致错误“参数必须是字符串或数字” - Alexandre Pereira
显示剩余2条评论
1个回答

2

以下是解决问题的方法:

这是我编写的代码。(附注:幸运的是,我有房价预测数据集:D)

from sklearn.preprocessing import LabelEncoder

path="....\house pricing"
filepath=os.path.join(path,"train.csv")

dataset_train=pd.read_csv(filepath)
dataset_train

cat_features=[x for x in dataset_train.columns if dataset_train[x].dtype=="object"]

le=LabelEncoder()

for col in cat_features:
    if col in dataset_train.columns:
        i = dataset_train.columns.get_loc(col)
        dataset_train.iloc[:,i] = dataset_train.apply(lambda i:le.fit_transform(i.astype(str)), axis=0, result_type='expand')

因此,你只需要修改这个部分:
dataset_train.iloc[:,i] =le.fit_transform(dataset_train.iloc[:,i])

with

dataset_train.iloc[:,i] = dataset_train.apply(lambda i:le.fit_transform(dataset_train[i].astype(str)), axis=0, result_type='expand')

上述Lambda函数将每个列及其数据点(按行< strong>轴=0 )转换为“str”,然后通过“fit_transform”将其传递到“le”或LableEncoder函数进行LabelEncode。


.astype(str) 对我很有帮助,谢谢。 - RukshanJS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接