使用Pandas进行独热(One-Hot)编码的理解

本文介绍如何使用Pandas库实现变量编码转换的过程,包括单一变量的向量化编码和矩阵形式的多变量编码。通过实例演示了如何操作并给出了具体的运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Series

编码过程

将vec看作为一个变量的4次抽样得到向量:

  1. 查看该变量可以取几种值 num = len(set(vec)),这里num=3;最终的编码结果用num位表示,这里用3为表示:xxx;
  2. 变量的不同取值按自然顺序(数字大小,字母先后)进行排序:seq = sorted(set(vec));
  3. 取每次抽样的取值,放到第二步得到的序列中,看该值在序列的哪一位相同,就将该位设置为1,其余的设置为0.

代码示例

import pandas as pd

if __name__ == '__main__':
    # vec = ('c', 'a', 'b', 'a')
    vec = list('caba')
    s = pd.Series(vec)

    print(pd.get_dummies(s))

运行结果

在这里插入图片描述

DataFrame

编码过程

将matrix看作3个变量的4次抽样——每列代表一个变量,每行是对3个变量的一次抽样:

  1. 列举每个变量的抽样的不同取值,将其按自然顺序排序后,按变量出现的次序进行拼接得到序列;
  2. 遍历矩阵行,行中出现了哪些值,就将上步得到的序列的相应位置记为1,其余位置记为0.

代码示例

import pandas as pd

if __name__ == '__main__': 
    matrix= [list('abc'), list('bdc'), list('bac'), list('acc')]
    df = pd.DataFrame(matrix)

    print(pd.get_dummies(df))

运行结果

在这里插入图片描述

<think>嗯,用户问的是在Pandas中如何建立one-hot编码。首先,我需要回忆一下什么是one-hot编码。记得它是一种将分类变量转换为二进制向量的方法,每个类别对应一个二进制特征,这样机器学习模型可以更好地处理这些数据。比如,颜色这个特征有红、蓝、绿三种,转换后就是三个列,分别代表是否是红色、蓝色、绿色,用0和1表示。 接下来,用户可能想知道在Pandas里具体的实现方法。通常,Pandas里有个函数叫get_dummies,应该是用来做这个的。但具体怎么用呢?比如,假设有一个DataFrame,里面有一列“颜色”,包含不同的颜色类别,如何将它转换成one-hot编码? 首先,可能需要导入pandas库,然后创建一个示例数据。例如: import pandas as pd data = {'ID': [1, 2, 3, 4], '颜色': ['红', '蓝', '绿', '蓝']} df = pd.DataFrame(data) 这时候,df的“颜色”列有三个不同的类别:红、蓝、绿。使用pd.get_dummies(df['颜色'])应该会生成三个新的列,分别对应这三个颜色,每行对应的位置为1,其余为0。 不过,用户可能需要注意处理那些可能存在的缺失值或者如何处理前缀。比如,生成的列默认前缀是原列名加下划线,比如“颜色_红”。如果想自定义前缀,可以在get_dummies里设置prefix参数。 另外,有时候可能需要将生成的one-hot编码合并回原来的DataFrame。这时候可以用pd.concat函数,把原DataFrame和get_dummies的结果连接起来,然后删除原来的分类列,避免重复。 比如: df = pd.concat([df, pd.get_dummies(df['颜色'], prefix='颜色')], axis=1) df = df.drop('颜色', axis=1) 这样,原来的“颜色”列就被替换成三个二进制列了。 还有一种情况,如果数据集中有多个分类列需要转换,可以直接对整个DataFrame使用get_dummies,并指定哪些列需要转换。例如: df_encoded = pd.get_dummies(df, columns=['颜色', '其他分类列']) 这样,Pandas会自动对这些列进行one-hot编码,并保持其他列不变。 还需要注意,如果测试集中出现了训练集中没有的类别,get_dummies可能生成不同的列数,这时候可能需要对齐列名,或者使用其他方法确保一致性。比如在训练时保存生成的列名,然后在测试时只保留这些列,多余的列删除,缺少的列补0。 此外,有时候可能需要处理有序分类变量,这时候可能需要考虑是否真的需要one-hot编码,或者使用其他编码方式如标签编码。不过用户的问题明确是关于one-hot的,所以这部分可能不需要展开。 最后,可能应该给出一个完整的例子,让用户能直接复制代码运行,看到效果。比如: import pandas as pd # 创建示例数据 data = {'ID': [1, 2, 3, 4], '颜色': ['红', '蓝', '绿', '蓝']} df = pd.DataFrame(data) # 使用get_dummies进行one-hot编码 df_encoded = pd.get_dummies(df, columns=['颜色']) print(df_encoded) 运行后的输出应该显示ID列和颜色_红、颜色_蓝、颜色_绿三列,对应的0和1值。 总结来说,Pandas中的get_dummies函数是创建one-hot编码的主要工具,用户需要了解如何应用它到特定列,处理多列情况,合并结果,以及注意可能出现的测试集与训练集类别不一致的问题。</think>在Pandas中建立one-hot编码主要通过`pd.get_dummies()`函数实现,以下是具体步骤和示例: --- ### **1. 基本用法** 假设有以下包含分类变量的DataFrame: ```python import pandas as pd data = {'ID': [1, 2, 3, 4], '颜色': ['红', '蓝', '绿', '蓝']} df = pd.DataFrame(data) ``` 使用`pd.get_dummies()`对“颜色”列编码: ```python # 对指定列生成one-hot编码 one_hot = pd.get_dummies(df['颜色'], prefix='颜色') ``` 输出结果: ``` 颜色_红 颜色_蓝 颜色_绿 0 1 0 0 1 0 1 0 2 0 0 1 3 0 1 0 ``` --- ### **2. 合并回原数据** 将生成的编码合并到原DataFrame,并删除原列: ```python df_encoded = pd.concat([df, one_hot], axis=1) # 横向合并 df_encoded = df_encoded.drop('颜色', axis=1) # 删除原列 ``` 结果: ``` ID 颜色_红 颜色_蓝 颜色_绿 0 1 1 0 0 1 2 0 1 0 2 3 0 0 1 3 4 0 1 0 ``` --- ### **3. 直接处理整个DataFrame** 若需对多个列编码,直接指定`columns`参数: ```python df_encoded = pd.get_dummies(df, columns=['颜色']) ``` --- ### **4. 处理未知类别** 测试集可能出现训练时未见的类别。为确保列对齐,可先保存训练时的列名: ```python # 训练阶段 train = pd.get_dummies(train_data) # 测试阶段 test = pd.get_dummies(test_data) test = test.reindex(columns=train.columns, fill_value=0) ``` --- ### **5. 高级参数** - `prefix`: 自定义生成列的前缀(例如`prefix='Col'`) - `dtype`: 指定数据类型(默认`uint8`,节省内存) - `drop_first`: 删除第一个类别(避免多重共线性) 示例: ```python pd.get_dummies(df, prefix='Color', drop_first=True) ``` --- ### **总结** Pandas的`pd.get_dummies()`是快速生成one-hot编码的核心工具,适合处理分类变量。注意处理训练集与测试集的列一致性,可通过列名对齐或`reindex()`解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值