特征提取pd.get_dummies() 详解(One-Hot Encoding)
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了特征提取pd.get_dummies() 详解(One-Hot Encoding)相关的知识,希望对你有一定的参考价值。
pd.get_dummies 详解
Pandas.get_dummies 用法简单介绍
Pandas 中的 get_dummies 方法主要用于对类别型特征做 One-Hot 编码(独热编码)。
pandas.get_dummies(data, prefix=None, prefix_sep=’_’,
dummy_na=False, columns=None,
sparse=False, drop_first=False, dtype=None)
参数说明:
-
data : array-like, Series, or DataFrame 输入的数据
-
prefix : string, list of strings, or dict of strings, default None。get_dummies转换后,列名的前缀
-
columns : list-like, default None。指定需要实现类别转换的列名
-
dummy_na : bool, default False,增加一列表示空缺值,如果False就忽略空缺值
-
drop_first : bool, default False,获得k中的k-1个类别值,去除第一个。
更多请参考:Link
主要参数介绍
data
data : array-like, Series, or DataFrame
传入的 data 为需要进行 One-Hot 编码的数据,包括 array-like, Series, or DataFrame 等类型数据。
对于类别型(category)特征,使用get_dummies(),结果如下:
import pandas as pd
df = pd.DataFrame('gender':['m','f','m','f','m','f','n'])
df_onehot = pd.get_dummies(df)
df_onehot
gender_f | gender_m | gender_n | |
---|---|---|---|
0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
2 | 0 | 1 | 0 |
3 | 1 | 0 | 0 |
4 | 0 | 1 | 0 |
5 | 1 | 0 | 0 |
6 | 0 | 0 | 1 |
若DataFrame中有数值型特征(columns),数值型column则保留原始值,如下例的 id 列:
data_df = pd.DataFrame('id':[1,2,3,4,5,6,7],'gender':['m','f','m','f','m','f','n'])
df_onehot = pd.get_dummies(data_df)
df_onehot
id | gender_f | gender_m | gender_n | |
---|---|---|---|---|
0 | 1 | 0 | 1 | 0 |
1 | 2 | 1 | 0 | 0 |
2 | 3 | 0 | 1 | 0 |
3 | 4 | 1 | 0 | 0 |
4 | 5 | 0 | 1 | 0 |
5 | 6 | 1 | 0 | 0 |
6 | 7 | 0 | 0 | 1 |
- 上面两个简单的例子不难发现,经过 get_dummies() 编码后新生成的列,列名为 “原列名_类别”,例如 " gender_f "。
- 当然,新列的命名方式也是可以自定义的。
- 如下,设置 prefix 即可:
prefix
prefix: string, list of strings, or dict of strings, default None
用于附加DataFrame列名的字符串。
在DataFrame上调用get_dummies时,传递长度等于列数的列表。或者,前缀可以是将列名映射到前缀的字典。
data_df = pd.DataFrame('id':[1,2,3,4,5,6,7],'gender':['m','f','m','f','m','f','n'])
df_onehot = pd.get_dummies(data_df, prefix ='gen')
df_onehot
id | gen_f | gen_m | gen_n | |
---|---|---|---|---|
0 | 1 | 0 | 1 | 0 |
1 | 2 | 1 | 0 | 0 |
2 | 3 | 0 | 1 | 0 |
3 | 4 | 1 | 0 | 0 |
4 | 5 | 0 | 1 | 0 |
5 | 6 | 1 | 0 | 0 |
6 | 7 | 0 | 0 | 1 |
当然,不只是前缀可以做更改,分隔符也可以自己设置,如下,设置 prefix_sep 即可。
prefix_sep
prefix_sep: string, default ‘_’
如果附加前缀,则使用分隔符/分隔符。或作为前缀传递列表或字典。
data_df = pd.DataFrame('id':[1,2,3,4,5,6,7],'gender':['m','f','m','f','m','f','n'])
df_onehot = pd.get_dummies(data_df, prefix ='gen', prefix_sep = '/')
df_onehot
id | gen/f | gen/m | gen/n | |
---|---|---|---|---|
0 | 1 | 0 | 1 | 0 |
1 | 2 | 1 | 0 | 0 |
2 | 3 | 0 | 1 | 0 |
3 | 4 | 1 | 0 | 0 |
4 | 5 | 0 | 1 | 0 |
5 | 6 | 1 | 0 | 0 |
6 | 7 | 0 | 0 | 1 |
其他参数(Parameters)
- dummy_na: bool, default False
如果忽略False NaNs,则添加一列来指示NaNs。 - columns: list-like, default None
要编码的DataFrame中的列名称。 如果列为None,则将转换具有object或category dtype的所有列。 - abs sparse: bool, default False
是否应该使用SparseArray (True)或常规NumPy数组(False)来支持用dummy编码的列。 - drop_first: bool, default False
Whether to get k-1 dummies out of k categorical levels by removing the first level.
New in version 0.18.0. - dtype: dtype, default np.uint8
Data type for new columns. Only a single dtype is allowed.
New in version 0.23.0.
Pandas.get_dummies 的用法
import pandas as pd
df = pd.DataFrame([
['green' , 'A'],
['red' , 'B'],
['blue' , 'A']])
df.columns = ['color', 'class']
pd.get_dummies(df)
color_blue | color_green | color_red | class_A | class_B | |
---|---|---|---|---|---|
0 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 1 |
2 | 1 | 0 | 0 | 1 | 0 |
可以对指定列进行get_dummies
pd.get_dummies(df.color)
blue | green | red | |
---|---|---|---|
0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 |
2 | 1 | 0 | 0 |
将指定列进行get_dummies 后合并到元数据中
df.join(pd.get_dummies(df.color))
color | class | blue | green | red | |
---|---|---|---|---|---|
0 | green | A | 0 | 1 | 0 |
1 | red | B | 0 | 0 | 1 |
2 | blue | A | 1 | 0 | 0 |
参考: Link
加油!
感谢!
努力!
以上是关于特征提取pd.get_dummies() 详解(One-Hot Encoding)的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:将 2,000,000 个 DataFrame 行转换为二进制矩阵 (pd.get_dummies()) 而不会出现内存错误?
sklearn LabelEncoder 和 pd.get_dummies 有啥区别?
想知道 pd.factorize、pd.get_dummies、sklearn.preprocessing.LableEncoder 和 OneHotEncoder 之间的区别 [关闭]