Pandas:将多值分类数据拆分为布尔列的实现方法
实现多值列的存在性布尔标识列
没问题,这需求其实是把逗号分隔的多值列,转换成对应每个可能值的存在性布尔列(True表示该行包含该值,False表示不包含),用Pandas可以很简洁地实现,我给你一步步来:
步骤1:准备示例数据
先把你给出的示例DataFrame创建出来:
import pandas as pd df = pd.DataFrame({'foo': ['b', 'a,b', 'a,c', 'a,b,c'], 'bar': ['X,Y', 'Z', 'Z,X', 'X,Y']})
步骤2:拆分多值列为布尔标识列
Pandas的str.get_dummies()方法专门用来处理这类分隔符分隔的多值列,它会自动生成每个唯一值的列,然后我们把数值类型转成布尔类型(0→False,1→True):
# 处理foo列,生成a、b、c的布尔列 foo_bool = df['foo'].str.get_dummies(sep=',').astype(bool) # 处理bar列,生成X、Y、Z的布尔列 bar_bool = df['bar'].str.get_dummies(sep=',').astype(bool)
步骤3:合并结果并调整列顺序
把两部分的布尔列合并成一个DataFrame,如果你需要严格按照a、b、c、X、Y、Z的顺序排列列,可以用reindex()调整:
# 合并两个布尔列集合 result = pd.concat([foo_bool, bar_bool], axis=1) # 按照指定顺序调整列 result = result.reindex(columns=['a', 'b', 'c', 'X', 'Y', 'Z'])
最终结果
运行完上面的代码后,result就是你要的表格:
| a | b | c | X | Y | Z | |
|---|---|---|---|---|---|---|
| 0 | False | True | False | True | True | False |
| 1 | True | True | False | False | False | True |
| 2 | True | False | True | True | False | True |
| 3 | True | True | True | True | True | False |
补充说明
- 如果你的数据里有空字符串或者缺失值,
str.get_dummies()会生成全False的对应列,完全符合需求; - 这个方法比循环判断每个值要高效得多,尤其适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者Amitai
相关产品推荐
相关产品推荐

