我有一个名为dataframe
的名称为train的“质量”列。
>>>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()
文档状态:data : array-like, Series, or DataFrame
因此,如果我可以同时提供序列或DataFrame
,那么输出为何不同?
答案 0 :(得分:1)
pd.get_dummies
documentation非常清楚:
columns
:类似列表,默认为None
DataFrame中的列名称为 编码。如果columns为None,则所有带有object或的列 类别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
答案 1 :(得分:1)
需要将数据转换为分类类型,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。熊猫中的数字类型与对象不同。您可以通过简单地传递df [[“ quality”]]。astype(“ category”)来解决此问题,因为这将强制将整数列转换为分类类别,然后返回虚拟列。
编辑:要扩展一点,必须记住虚拟变量是回归(或回归扩展)的一种构造。如果数据框同时包含数字类型和对象类型的dtypes,则通常将这些数字类型直接用作模型的输入。但是,除非转换为伪变量,否则对象类型在回归中没有任何价值。因此,如果有人将具有三种数字类型和一种对象类型的DataFrame传递给get_dummies,则将一种对象类型转换为虚拟变量。 这是默认的行为,如果未指定columns参数。在默认行为不符合您的需求的情况下,例如存在columns参数。您不希望转换所有对象/类别dtype列,或者希望转换一列数字dtype。