如何将包含列表的列高效转换为独热编码(One-Hot)列

胖涛小哥_4677

胖涛小哥_4677

2026-08-16

396人浏览

原创

如何将包含列表的列高效转换为独热编码(One-Hot)列

本文介绍两种基于 pandas 的高效方法,将 DataFrame 中存储列表的列(如 ['A', 'B'])一键转换为多列独热编码(A/B/C 列取值为 0 或 1),无需循环或手动遍历,兼顾可读性与性能。

本文介绍两种基于 pandas 的高效方法,将 dataframe 中存储列表的列(如 `['a', 'b']`)一键转换为多列独热编码(a/b/c 列取值为 0 或 1),无需循环或手动遍历,兼顾可读性与性能。

在数据预处理中,常遇到某列以 Python 列表形式存储多个类别标签(例如用户兴趣标签、商品多品类归属等)。直接对这类列建模不可行,需先展开为独热编码格式。Pandas 提供了简洁优雅的链式操作方案,核心在于 explode() + 统计聚合 的组合。

以下以示例数据为基准:

import pandas as pd
df = pd.DataFrame({
    'id': [1, 2, 3],
    'items': [['A', 'B'], ['A', 'B', 'C'], ['A', 'C']]
})

✅ 方法一:pd.crosstab()(推荐 —— 简洁、语义清晰)

利用 explode() 展开列表后,用 crosstab 直接生成交叉频数表,天然适配独热需求(存在即为 1,不存在即为 0):

result = df.merge(
    pd.crosstab(*df.explode('items').to_numpy().T)
    .reset_index(names='id')
)
print(result)

? 原理说明:df.explode('items') 将每行列表拆为多行 → .to_numpy().T 转置为 (id_col, items_col) 元组 → crosstab 自动统计每个 id 对应各 item 的出现次数(非 0 即 1)→ merge 回原表。

✅ 方法二:pivot_table()(灵活、支持扩展)

更显式地控制索引、列与聚合逻辑,适合后续需扩展(如统计频次、加权等)的场景:

result = df.merge(
    df.explode('items')
    .pivot_table(
        index='id', 
        columns='items', 
        values='id', 
        aggfunc='size',     # 等价于 len,但更高效
        fill_value=0
    )
    .rename_axis(None, axis=1)  # 移除列名 'items'
    .reset_index()
)

⚠️ 注意:aggfunc='size' 比 len 更优(避免空组报错),且 fill_value=0 确保缺失项补零;rename_axis(None, axis=1) 是关键步骤,否则列名会保留 items 标签,影响后续使用。

? 补充说明与最佳实践

  • 性能对比:两种方法在中小规模数据(crosstab 在纯二值场景下语义更精准,pivot_table 更灵活。
  • 列名一致性:若原始 items 列含重复值(如 ['A', 'A', 'B']),explode 后会生成重复行,此时 crosstab 和 pivot_table(..., aggfunc='size') 仍正确计数(可 >1);如严格需要“是否包含”(即 0/1),可追加 .clip(upper=1)。
  • 缺失值处理:explode() 会自动跳过 NaN 或空列表([]),如需保留空行,可先用 df['items'].apply(lambda x: x if x else ['__MISSING__']) 预填充。
  • 最终输出结构:结果自动保留原始列(如 id, items),并新增独热列(A, B, C),类型为 int64,可直接用于 scikit-learn 等下游模型。

掌握这两种模式,即可从容应对各类嵌套列表型特征的向量化任务——简洁、健壮、符合 pandas 函数式编程范式。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Python 机器学习入门与 Scikit-Learn 实战
Python 机器学习入门与 Scikit-Learn 实战

面向机器学习初学者,以 Scikit-Learn 为核心工具,讲解机器学习基本概念(监督学习/无监督学习/模型评估)、数据预处理(标准化/归一化/缺失值填充/特征编码)、常用分类算法(逻辑回归/决策树/随机森林/SVM/KNN)、回归算法(线性回归/岭回归/Lasso)、无监督聚类(K-Means/DBSCAN)、交叉验证与超参数调优(GridSearch/RandomSearch)、混淆矩阵与 ROC/AUC 模型评估指标,帮助开发者

2026.04.24

335

29

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

2025.12.04

300

15

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

2026.01.31

212

21

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

2026.04.13

371

25

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

0

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

0

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

200

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

120

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

100

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习