如何对多列数据进行one-hot编码?寻求高效实现方案
问题与解答
问题
我搜索相关主题时得到的答案都不符合需求。假设我有如下表格:
| Item | N1 | N2 | N3 | N4 |
|---|---|---|---|---|
| Item1 | 1 | 2 | 4 | 8 |
| Item2 | 2 | 3 | 6 | 7 |
| Item3 | 4 | 5 | 7 | 9 |
| Item4 | 1 | 5 | 6 | 7 |
| Item5 | 3 | 4 | 7 | 8 |
我希望对其进行one-hot编码,得到如下结果:
| Item | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| Item1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
| Item2 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
| Item3 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
| Item4 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
| Item5 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
请问这个需求是否可行?我现在正在写循环遍历每行的代码,但想知道有没有更高效的实现方式。
解答
这个需求完全可行,且无需手动编写低效循环,用Pandas的向量化操作就能快速实现,步骤如下:
- 将原始宽格式数据重塑为长格式,保留
Item作为分组标识 - 利用交叉表生成one-hot编码,自动统计每个数值在对应
Item行中的出现情况(出现则为1,未出现为0) - 按需调整列的排序,匹配目标格式
示例代码
import pandas as pd # 构造原始数据(实际使用时可通过pd.read_csv等方法加载) df = pd.DataFrame({ 'Item': ['Item1', 'Item2', 'Item3', 'Item4', 'Item5'], 'N1': [1, 2, 4, 1, 3], 'N2': [2, 3, 5, 5, 4], 'N3': [4, 6, 7, 6, 7], 'N4': [8, 7, 9, 7, 8] }) # 重塑数据:把N1-N4列转为行数据 melted_df = df.melt(id_vars='Item', value_name='value') # 生成one-hot编码并按Item聚合 one_hot_result = pd.crosstab(melted_df['Item'], melted_df['value']).reset_index() # 按数值从小到大排序列 one_hot_result = one_hot_result[['Item'] + sorted(one_hot_result.columns.drop('Item'))] # 输出结果 print(one_hot_result)
这段代码的输出与你期望的结果完全一致,且向量化操作比手动循环效率高得多,处理大规模数据集时优势尤为明显。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

