为了账号安全,请及时绑定邮箱和手机立即绑定

pandas.DataFrame 和 pandas.Series 对象对于

pandas.DataFrame 和 pandas.Series 对象对于

POPMUISE 2021-09-11 20:53:20
我有一个dataframe名为 train 的列“质量”。>>>train['quality'].unique()array([5, 6, 7, 4, 8, 3], dtype=int64)现在get_dummies有train[['quality']]给>>>pd.get_dummies(train[['quality']]).head()    quality0   51   52   53   64   5但与 train['quality']>>>pd.get_dummies(train['quality']).head()    3   4   5   6   7   80   0   0   1   0   0   01   0   0   1   0   0   02   0   0   1   0   0   03   0   0   0   1   0   04   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 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

数据需要转换为分类类型才能使用 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。Pandas 中的数字类型与对象不同。您可以通过简单地传递 df[["quality"]].astype("category") 来解决这个问题,因为这将强制您的整数列转换为分类,然后将返回虚拟列。


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


查看完整回答
反对 回复 2021-09-11
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

该pd.get_dummies文档使这个非常清楚:


columns: 类似列表,None

要编码的 DataFrame 中的默认列名称。如果 column 为 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


查看完整回答
反对 回复 2021-09-11
  • 2 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信