猿问

pandas.DataFrame 和 pandas.Series 对象对于

我有一个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为什么输出不同?


POPMUISE
浏览 221回答 2
2回答

料青山看我应如是

数据需要转换为分类类型才能使用 get_dummies。如果传入一个系列,转换会自动发生。如文档中和coldspeed所述,如果传入DataFrame,则所有对象或类别dtypes(这些数据类型的系列)都将转换为categorical,并将产生虚拟列。例如:pandas.get_dummies(pandas.DataFrame(list("abcdabcd")))&nbsp;&nbsp; &nbsp;0_a&nbsp; 0_b&nbsp; 0_c&nbsp; 0_d0&nbsp; &nbsp; 1&nbsp; &nbsp; 0&nbsp; &nbsp; 0&nbsp; &nbsp; 01&nbsp; &nbsp; 0&nbsp; &nbsp; 1&nbsp; &nbsp; 0&nbsp; &nbsp; 02&nbsp; &nbsp; 0&nbsp; &nbsp; 0&nbsp; &nbsp; 1&nbsp; &nbsp; 03&nbsp; &nbsp; 0&nbsp; &nbsp; 0&nbsp; &nbsp; 0&nbsp; &nbsp; 14&nbsp; &nbsp; 1&nbsp; &nbsp; 0&nbsp; &nbsp; 0&nbsp; &nbsp; 05&nbsp; &nbsp; 0&nbsp; &nbsp; 1&nbsp; &nbsp; 0&nbsp; &nbsp; 06&nbsp; &nbsp; 0&nbsp; &nbsp; 0&nbsp; &nbsp; 1&nbsp; &nbsp; 07&nbsp; &nbsp; 0&nbsp; &nbsp; 0&nbsp; &nbsp; 0&nbsp; &nbsp; 1这是有效的,因为字符串列表变成了一列作为对象的字符串。也许有点不直观,您的整数类型列不是“对象”类型,因此不会转换为分类列,因此不会返回虚拟列并返回原始 DataFrame。Pandas 中的数字类型与对象不同。您可以通过简单地传递 df[["quality"]].astype("category") 来解决这个问题,因为这将强制您的整数列转换为分类,然后将返回虚拟列。编辑:要扩展一点,必须记住虚拟变量是回归(或回归的扩展)的构造。如果 Dataframe 包含既是数字又是对象的 dtype,则通常情况下,数字类型旨在直接用作模型的输入。但是,对象类型在回归中没有价值,除非转换为虚拟变量。因此,如果有人将具有三种数字类型和一种对象类型的 DataFrame 传递给 get_dummies,则一种对象类型将被转换为虚拟变量。如果列参数未指定,这只是默认行为. 如果默认行为不适合您的需要,则存在列参数,例如您不希望转换所有对象/分类 dtype 列,或者您希望转换数字 dtype 列。

潇潇雨雨

该pd.get_dummies文档使这个非常清楚:columns: 类似列表,None要编码的 DataFrame 中的默认列名称。如果 column 为 None 则所有具有 object 或 category dtype 的列都将被转换。因此,解决方案是指定一个columns参数,从而覆盖对列是分类/对象类型的要求,pd.get_dummies(df, columns=['quality'])&nbsp; &nbsp;quality_5&nbsp; quality_60&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 01&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 02&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 03&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 14&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0或者,将列转换为分类列。pd.get_dummies(df[['quality']].astype('category'))&nbsp; &nbsp;quality_5&nbsp; quality_60&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 01&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 02&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 03&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 14&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0
随时随地看视频慕课网APP

相关分类

Python
我要回答