尝试在python中标记编码时,ValueError包含新标签

尝试在python中标记编码时,ValueError包含新标签,python,pandas,dataframe,encoding,Python,Pandas,Dataframe,Encoding,我有一个需要标签编码的数据集。我正在使用sklearn的标签编码器进行同样的操作 以下是问题的可再现代码: import pandas as pd from sklearn.preprocessing import LabelEncoder data11 = pd.DataFrame({'Transaction_Type': ['Mortgage', 'Credit reporting', 'Consumer Loan', 'Mortgage'],

我有一个需要标签编码的数据集。我正在使用sklearn的标签编码器进行同样的操作

以下是问题的可再现代码:

import pandas as pd
from sklearn.preprocessing import LabelEncoder

data11 = pd.DataFrame({'Transaction_Type': ['Mortgage', 'Credit reporting', 'Consumer Loan', 'Mortgage'], 
                       'Complaint_reason': ['Incorrect Info', 'False Statement', 'Using a Debit Card', 'Payoff process'],
                       'Company_response': ['Response1', 'Response2', 'Response3', 'Response1'],
                       'Consumer_disputes': ['Yes', 'No', 'No', 'Yes'],
                       'Complaint_Status': ['Processing','Closed', 'Awaiting Response', 'Closed']
                       })

le = LabelEncoder()
data11['Transaction_Type'] = le.fit_transform(data11['Transaction_Type'])
data11['Complaint_reason'] = le.transform(data11['Complaint_reason'])
data11['Company_response'] = le.fit_transform(data11['Company_response'])
data11['Consumer_disputes'] = le.transform(data11['Consumer_disputes'])
data11['Complaint_Status'] = le.transform(data11['Complaint_Status'])
所需的输出应类似于:

({'Transaction_Type': ['1', '2', '3', '1'], 
                       'Complaint_reason': ['1', '2', '3', '4'],
                       'Company_response': ['1', '2', '3', '1'],
                       'Consumer_disputes': ['1', '2', '2', '1'],
                       'Complaint_Status': ['1','2', '3', '2']
                       })
问题是当我尝试对列进行编码时: “交易类型”和“公司响应”成功编码,但“投诉原因”、“消费者争议”和“投诉状态”列出现错误

就“投诉理由”而言:

File "C:/Users/Ashu/untitled0.py", line 26, in <module>
    data11['Complaint_reason'] = le.transform(data11['Complaint_reason'])

ValueError: y contains new labels: ['APR or interest rate' 'Account opening, closing, or management'
 'Account terms and changes' ...
 "Was approved for a loan, but didn't receive the money"
 'Written notification about debt' 'Wrong amount charged or received']
文件“C:/Users/Ashu/untitled0.py”,第26行,在
data11['Complaint_reason']=le.transform(data11['Complaint_reason'])
ValueError:y包含新标签:[“APR或利率”“开户、结账或管理”
“账户条款和变更”。。。
被批准贷款,但没有收到钱
“关于债务的书面通知”“收取或收到的金额错误”]
同样,对于“消费者纠纷”:

  File "<ipython-input-117-9625bd78b740>", line 1, in <module>
    data11['Consumer_disputes'] = le.transform(data11['Consumer_disputes'].astype(str))

ValueError: y contains new labels: ['No' 'Yes']
文件“”,第1行,在
data11['Consumer_disferences']=le.transform(data11['Consumer_disferences'].astype(str))
ValueError:y包含新标签:[“否”“是”]
与“投诉状态”类似:

  File "<ipython-input-119-5cd289c72e45>", line 1, in <module>
    data11['Complaint_Status'] = le.transform(data11['Complaint_Status'])

ValueError: y contains new labels: ['Closed' 'Closed with explanation' 'Closed with monetary relief'
 'Closed with non-monetary relief' 'Untimely response']
文件“”,第1行,在
data11['Complaint_Status']=le.transform(data11['Complaint_Status'])
ValueError:y包含新标签:[“关闭”以解释结束“以货币减免结束”
“以非货币救济结束”“响应不及时”]
这些都是以句子形式固定输入的分类变量。以下是数据切片图像:


关于这方面有几个问题,但没有一个得到成功回答。

由于所有列都不同,我认为您需要为每个列初始化
le

for col in data11.columns:
    le = LabelEncoder()
    data11[col] = le.fit_transform(data11[col])

   Transaction_Type  Complaint_reason  Company_response  Consumer_disputes  \
0                 2                 1                 0                  1   
1                 1                 0                 1                  0   
2                 0                 3                 2                  0   
3                 2                 2                 0                  1   

   Complaint_Status  
0                 2  
1                 1  
2                 0  
3                 1  

您缺少fit\u transform(),这就是为什么会出现错误

sklearn.preprocessing.LabelEncoder->对值介于0和n_classes-1之间的标签进行编码(来自官方文档)

不过,如果您想在1和n_类之间对类进行编码,只需添加1即可

data11['Transaction_Type'] = le.fit_transform(data11['Transaction_Type'])
data11['Transaction_Type']
输出:

0    2
1    1
2    0
3    2
Name: Transaction_Type, dtype: int64 
    Transaction_Type    Complaint_reason    Company_response    Consumer_disputes   Complaint_Status
0   1                      1                  1                      1              1
1   2                      2                  2                      1              2
2   3                      3                  3                      2              2
3   3                      4                  1                      2              3
注意这里,LabelEncoder()按字母顺序编码,它将给消费者贷款提供一个0的标签,该标签按字母顺序排在第一位。类似地,它给出了一个标签2 toMortage,该标签按顺序排在最后

现在,您有两种方法对其进行编码,或者像这样接受LabelEncoder的默认输出

data11['Transaction_Type'] = le.fit_transform(data11['Transaction_Type'])
data11['Complaint_reason'] = le.fit_transform(data11['Complaint_reason'])
data11['Company_response'] = le.fit_transform(data11['Company_response'])
data11['Consumer_disputes'] = le.fit_transform(data11['Consumer_disputes'])
data11['Complaint_Status'] = le.fit_transform(data11['Complaint_Status'])
输出:

        Transaction_Type  Complaint_reason Company_response Consumer_disputes Complaint_Status
0                   2            1              0              1                2
1                   1            0              1              0                1
2                   0            3              2              0                0
3                   2            2              0              1                1

输出:

0    2
1    1
2    0
3    2
Name: Transaction_Type, dtype: int64 
    Transaction_Type    Complaint_reason    Company_response    Consumer_disputes   Complaint_Status
0   1                      1                  1                      1              1
1   2                      2                  2                      1              2
2   3                      3                  3                      2              2
3   3                      4                  1                      2              3

是的,这种方法会起作用,但我不需要每次初始化le,abdur的答案是正确的。我错过了未转换的one中的fit_转换。但你的解决方案也会奏效。谢谢:)是的,你说得对。。。我真傻。。在发布之前应仔细遵守代码。。谢谢