我有一个名为train的 dataframe
,列'quality' .
>>>train['quality'].unique()
array([5, 6, 7, 4, 8, 3], dtype=int64)
现在 get_dummies
与 train[['quality']]
给出
>>>pd.get_dummies(train[['quality']]).head()
quality
0 5
1 5
2 5
3 6
4 5
但是 train['quality']
>>>pd.get_dummies(train['quality']).head()
3 4 5 6 7 8
0 0 0 1 0 0 0
1 0 0 1 0 0 0
2 0 0 1 0 0 0
3 0 0 0 1 0 0
4 0 0 1 0 0 0
train[['quality']]
和 train['quality']
的数据类型是: -
>>>print(type(train['quality']))
<class 'pandas.core.series.Series'>
>>>print(type(train[['quality']]))
<class 'pandas.core.frame.DataFrame'>
get_dummies()
doc说明: data : array-like, Series, or DataFrame
因此,如果我可以同时提供系列或 DataFrame
那么为什么输出会有所不同?
2 回答
pd.get_dummies documentation非常清楚:
因此,解决方案是指定
columns
参数,从而覆盖列开始为分类/对象类型的要求,或者,将列转换为分类 .
需要将数据转换为分类类型才能使get_dummies正常工作 . 如果传入系列,则会自动进行转换 . 如文档和coldspeed中所述,如果传入DataFrame,则所有对象或类别dtypes(这些数据类型的系列)都将转换为分类,并将生成虚拟列 . 例如:
这是有效的,因为字符串列表变成了一列作为对象的字符串 .
也许有点不直观,您的整数类型列不是“对象”类型,因此不会转换为分类,因此不会返回虚拟列并返回原始DataFrame . 大熊猫中的数字类型与对象不同 . 您可以通过简单地传递df [[“quality”]] . astype(“category”)来解决这个问题,因为这会强制将整数列转换为分类,然后返回虚拟列 .
编辑:要扩展一点,必须记住,虚拟变量是回归(或回归的扩展)的构造 . 如果Dataframe包含同时包含数字和对象的dtypes,则通常会将数字类型直接用作模型的输入 . 但是,除非转换为虚拟变量,否则对象类型在回归中没有值 . 因此,如果有人将具有三种数字类型和一种对象类型的DataFrame传递给get_dummies,则一种对象类型将转换为虚拟变量 . 如果未指定columns参数,则这只是默认行为 . 如果默认行为不符合您的需要,则存在columns参数,例如您不希望转换所有对象/分类dtype列,或者您希望转换数字dtype列 .