我有这个专栏
df["Pclass"].tail()
Pclass
2
1
3
1
3
我创建了柱子的假人
dummies = pd.get_dummies(df["Pclass"],prefix="Pclass")
df = pd.concat([df,dummies],axis=1)
结果
df["Pclass_1"].tail()
Pclass_1 Pclass_2 Pclass_3
886 0 1 0
887 1 0 0
888 0 0 1
889 1 0 0
890 0 0 1
我不会放弃,因为它会按照规则将列中的数字转换为1和0
答案 0 :(得分:4)
pd.get_dummies
基本上,它将类别的每个唯一值都转到其自己的列,并具有一个布尔标志(1
或0
)来标记该行上存在哪个分类值。
让我们看一个不那么抽象的示例:
df = pd.DataFrame({'sex':['male', 'female', 'unknown', 'female']})
sex
0 male
1 female
2 unknown
3 female
df.join(pd.get_dummies(df['sex'], prefix='sex'))
sex sex_female sex_male sex_unknown
0 male 0 1 0
1 female 1 0 0
2 unknown 0 0 1
3 female 1 0 0
如您所见,原始列的第一行是male
,在虚拟变量列sex_male
中,我们看到有一个标记1
。
sex sex_female sex_male sex_unknown
0 male 0 1 0
然后在第二行的原始列中,值为female
,我们在虚拟变量列sex_female
中看到标志1
:
sex sex_female sex_male sex_unknown
1 female 1 0 0
以此类推。
要记住的重要一点是,当您应用pd.get_dummies
时:
amount of new dummie columns = amount of unique values in original caterogical column
用机器学习的术语来说,我们称之为单次编码
使用scikit-learn
时,外观如下:
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
encoder.fit_transform(df['sex'].to_numpy().reshape(-1,1)).toarray()
array([[0., 1., 0.],
[1., 0., 0.],
[0., 0., 1.],
[1., 0., 0.]])
答案 1 :(得分:2)
依赖于数字输入的预测模型不能直接 处理开放的文本字段或分类属性。 相反,这些信息丰富的数据需要在处理之前 将信息呈现给模型。 基于树的模型和朴素贝叶斯模型是例外。大多数型号 要求预测变量采用数字形式。
为无序类别创建虚拟变量是一种将分类属性转换为数字的方法。 @Erfan回答了虚拟变量的作用。但是以编码有序属性为例:具有C类的无序预测变量可以由C-1表示 二进制伪变量或二进制伪变量的哈希版本。 这些方法有效地将分类信息呈现给 模型。
但是现在假设C类具有相对顺序。对于 例如,考虑具有“低”,“中”类别的预测变量, 和“高”。 像对无序数据一样创建虚拟属性会丢失 相对顺序中包含的信息。
对于有序数据编码:
答案 2 :(得分:1)
它为出现在原始列中的每个值创建一个虚拟列,然后如果该行具有与该虚拟列对应的值,则为每一行放置一个1,否则为0。
第886行的Pclass列为2,因此在Pclass_2列中转换为1,在所有其他虚拟列中转换为0。
行887的Pclass列为1,因此在Pclass_1列中转换为1,在所有其他虚拟列中转换为0。