2 回答
TA贡献1772条经验 获得超8个赞
数据需要转换为分类类型才能使用 get_dummies。如果传入一个系列,转换会自动发生。如文档中和coldspeed所述,如果传入DataFrame,则所有对象或类别dtypes(这些数据类型的系列)都将转换为categorical,并将产生虚拟列。例如:
pandas.get_dummies(pandas.DataFrame(list("abcdabcd")))
0_a 0_b 0_c 0_d
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
4 1 0 0 0
5 0 1 0 0
6 0 0 1 0
7 0 0 0 1
这是有效的,因为字符串列表变成了一列作为对象的字符串。
也许有点不直观,您的整数类型列不是“对象”类型,因此不会转换为分类列,因此不会返回虚拟列并返回原始 DataFrame。Pandas 中的数字类型与对象不同。您可以通过简单地传递 df[["quality"]].astype("category") 来解决这个问题,因为这将强制您的整数列转换为分类,然后将返回虚拟列。
编辑:要扩展一点,必须记住虚拟变量是回归(或回归的扩展)的构造。如果 Dataframe 包含既是数字又是对象的 dtype,则通常情况下,数字类型旨在直接用作模型的输入。但是,对象类型在回归中没有价值,除非转换为虚拟变量。因此,如果有人将具有三种数字类型和一种对象类型的 DataFrame 传递给 get_dummies,则一种对象类型将被转换为虚拟变量。如果列参数未指定,这只是默认行为. 如果默认行为不适合您的需要,则存在列参数,例如您不希望转换所有对象/分类 dtype 列,或者您希望转换数字 dtype 列。
TA贡献1833条经验 获得超4个赞
该pd.get_dummies文档使这个非常清楚:
columns: 类似列表,None
要编码的 DataFrame 中的默认列名称。如果 column 为 None 则所有具有 object 或 category dtype 的列都将被转换。
因此,解决方案是指定一个columns参数,从而覆盖对列是分类/对象类型的要求,
pd.get_dummies(df, columns=['quality'])
quality_5 quality_6
0 1 0
1 1 0
2 1 0
3 0 1
4 1 0
或者,将列转换为分类列。
pd.get_dummies(df[['quality']].astype('category'))
quality_5 quality_6
0 1 0
1 1 0
2 1 0
3 0 1
4 1 0
添加回答
举报