无法更改一列中的分类数据(Pandas、机器学习)

2024-09-29 21:50:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我从机器学习开始,已经在做一些任务了。 我想设置(预处理)表列,因为列中的数据是分类的。我已成功处理(更改值)除最后一列以外的所有列。我从中加载(dataset = pd.read_csv("car.data"))我的值的数据文件是car.data(我从internet下载的)。我正在使用pandas和所有重要的ML库(tensorflow、sklearn、numpy…)

当我运行代码时,所有列都用数字填充,只有最后一列用“无”填充。我注意到,当我运行:dataset.unacc.unique()时,我得到以下输出: array([None], dtype=object)并且它不应该是object类型。在正确的代码中是不同的:array([0, 1, 3, 2], dtype=int64)

有人能帮我解决这个问题吗?我在网上找不到它。先谢谢你

这是我的密码:

dataset.unacc.unique()

此函数用于更改列中的值:

def label_fixTarget(something):
    if something=='unacc':
        return 0
    elif something=='acc':
        return 1
    elif something=='vgood':
        return 3
    elif something=="good":
        return 2 
dataset['unacc'] = dataset['unacc'].apply(label_fixTarget)
dataset.unacc.unique()
dataset.head()

这是我的新桌子:

enter image description here


Tags: 代码机器datareturnobjectcararraydataset
2条回答

这不是编码分类数据的正确方法

要实现您想要的,您需要使用sklearn.preprocessing.LabelEncoder

import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame({'a': ['unacc', 'acc', 'good', 'vgood']})

label_encoder = LabelEncoder()

label_encoder.fit(df['a'])

# Putting in encoded categories into another column `encoded`
df['encoded'] = label_encoder.transform(df['a'])

print(df)
# This prints the following `df`
#        a  encoded
# 0  unacc        2
# 1    acc        0
# 2   good        1
# 3  vgood        3

调用fit后的label_encoder包含有关将类别转换为整数的所有信息。请注意,它不会转换未看到的内容,例如,如果我执行:

label_encoder.transform(['a', 'b'])

如果在调用fit期间既没有遇到“a”也没有遇到“b”,则将导致异常。

如何将整数解码回标签:

# Just like `transform`, we also have `inverse_transform`.
df['decoded'] = label_encoder.inverse_transform(df['encoded'])
print(df)
# This will print something like:
#        a  encoded decoded
# 0  unacc        2   unacc
# 1    acc        0     acc
# 2   good        1    good
# 3  vgood        3   vgood

所以首先我对列“a”进行编码,并将编码值放入“encoded”列。然后为了测试inverse_transform,我对编码的值(在“encoded”列下的值)调用了逆变换,然后将结果放在“decoded”列中

列“a”和“decoded”应该相同,并且它们是相同的

您还可以打印调用fitlabel_encoder识别的类

print(label_encoder.classes_)
# This will print
# array(['acc', 'good', 'unacc', 'vgood'], dtype=object)

注意:我将来自transform()(返回一个numpy.array)的结果放在同一df中的“encoded”列中,inverse_transform()的结果放在“decoded”列中,只是为了证明解码值必须与初始值相同

LabelEncoder scikit-learn documentation

如果知道要更改的值,可以创建字典并将其映射到列上,例如:

qualityToPoint ={
'TA' : 3,
'Fa' : 2,
'Gd' : 4,
'None': 0,
'Ex': 5,
'Po' : 1}

df['column'] = df['column'].map(qualityToPoint).astype('int')

相关问题 更多 >

    热门问题