首页 > 解决方案 > pandas.DataFrame 和 pandas.Series 对象对 pandas.get_dummies() 的作用不同

问题描述

我有一dataframe列名为“质量”的火车。

>>>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那么为什么输出会有所不同?

标签: pythonpython-3.xpandas

解决方案


pd.get_dummies文档清楚地说明了这一点:

columnsNone
:要编码的 DataFrame 中的类似列表的默认列名。如果 columns 是 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

推荐阅读