pandas.DataFrame和pandas.Series对象对pandas.get_dummies()的作用不同

时间:2018-12-10 10:57:34

标签: python python-3.x pandas

我有一个名为dataframe的名称为train的“质量”列。

>>>train['quality'].unique()
array([5, 6, 7, 4, 8, 3], dtype=int64)

现在get_dummiestrain[['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,那么输出为何不同?

2 个答案:

答案 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。