首页 文章

pandas.DataFrame和pandas.Series对象对pandas.get_dummies()的行为有所不同

提问于
浏览
0

我有一个名为train的 dataframe ,列'quality' .

>>>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() doc说明: data : array-like, Series, or DataFrame

因此,如果我可以同时提供系列或 DataFrame 那么为什么输出会有所不同?

2 回答

  • 1

    pd.get_dummies documentation非常清楚:

    columns:list-like,default无要编码的DataFrame中的列名 . 如果列为None,则将转换具有对象或类别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

    需要将数据转换为分类类型才能使get_dummies正常工作 . 如果传入系列,则会自动进行转换 . 如文档和coldspeed中所述,如果传入DataFrame,则所有对象或类别dtypes(这些数据类型的系列)都将转换为分类,并将生成虚拟列 . 例如:

    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”)来解决这个问题,因为这会强制将整数列转换为分类,然后返回虚拟列 .

    编辑:要扩展一点,必须记住,虚拟变量是回归(或回归的扩展)的构造 . 如果Dataframe包含同时包含数字和对象的dtypes,则通常会将数字类型直接用作模型的输入 . 但是,除非转换为虚拟变量,否则对象类型在回归中没有值 . 因此,如果有人将具有三种数字类型和一种对象类型的DataFrame传递给get_dummies,则一种对象类型将转换为虚拟变量 . 如果未指定columns参数,则这只是默认行为 . 如果默认行为不符合您的需要,则存在columns参数,例如您不希望转换所有对象/分类dtype列,或者您希望转换数字dtype列 .

相关问题