基于Pandas处理DataFrame多值列:生成独热编码式新列
解决方案:用Pandas快速实现多值列的二进制标记
嘿,这个需求其实用Pandas的内置工具就能完美解决,根本不用自己写复杂的遍历逻辑!这本质上是**独热编码(One-Hot Encoding)**的典型场景,专门用来把这类多值分隔列转换成二进制标记列。
方法一:最简洁的内置函数法(推荐)
Pandas的str.get_dummies()方法直接支持按分隔符拆分列并生成独热编码,一步到位:
步骤1:准备示例数据(模拟你的场景)
import pandas as pd # 模拟你的DataFrame:target_col列包含单个或多个用;分隔的值 data = {'target_col': ['A;B', 'C', 'A;C;D', 'B;E', 'A', 'F;G;H;I;J']} df = pd.DataFrame(data)
步骤2:生成独热编码列并合并到原表
# 按;拆分并生成二进制标记列 dummies_df = df['target_col'].str.get_dummies(sep=';') # 将结果与原DataFrame横向合并 final_df = pd.concat([df, dummies_df], axis=1)
最终效果
执行后你会得到这样的结果:
| target_col | A | B | C | D | E | F | G | H | I | J |
|---|---|---|---|---|---|---|---|---|---|---|
| A;B | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| C | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| A;C;D | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| B;E | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| A | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| F;G;H;I;J | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
这个方法的优势在于:
- 自动识别所有唯一值,无需手动收集
- 底层是向量化操作,比手动遍历效率高得多(尤其是数据量大时)
- 一行代码完成拆分+编码,简洁易维护
方法二:手动实现(适合理解底层逻辑)
如果你想自己实现遍历逻辑(比如学习用途),可以按以下步骤来:
# 1. 收集所有唯一值 all_unique_vals = set() for cell_val in df['target_col']: # 按;拆分当前单元格的值,添加到集合中去重 all_unique_vals.update(cell_val.split(';')) # 转换成有序列表(可选,保证列顺序一致) all_unique_vals = sorted(all_unique_vals) # 2. 为每个唯一值创建标记列 for val in all_unique_vals: # 用lambda判断当前值是否在单元格的拆分结果中,是则标记1,否则0 df[val] = df['target_col'].apply(lambda x: 1 if val in x.split(';') else 0)
这个方法和内置函数的效果完全一致,但因为用了apply遍历每行,数据量大时效率会比str.get_dummies()低一些,所以更适合学习原理,实际业务中优先用方法一。
内容的提问来源于stack exchange,提问作者dodo4545
相关产品推荐
相关产品推荐

