如何将含逗号分隔字符串列的Pandas DataFrame转换为0-1存在/缺失矩阵
问题解决代码与说明
你之前的代码仅适用于输入为字典的场景,当输入为DataFrame时,master.items()会遍历列名与对应列数据,因此得到的是列内值的出现次数,不符合需求。
实现思路
- 对存储列表的
categories、CUI_desc两列分别做独立的多标签01编码,pandas内置的str.get_dummies()方法可以直接实现这个需求,不需要手动调用Counter - 把两列的编码结果和原始保留列
annotations按行拼接即可得到目标结果
完整可运行代码
import pandas as pd # --------------- 示例数据构造,你使用自己的数据集时可删除这部分 --------------- master = pd.DataFrame({ 'annotations': ['heroine', 'heroin', 'he smoked two packs a day'], 'categories': [['heroic', 'opioid', 'substance_abuse'], ['heroic', 'opioid', 'substance_abuse'], ['opioid', 'substance_abuse']], 'CUI_desc': [['C0011892___heroin'], ['C0011892___heroin'], ['C0439234___year', 'C0748223___QUIT', 'C0028040___nicotine']] }) # ------------------------------------------------------------------------- # 核心处理逻辑 cat_onehot = master['categories'].str.join('|').str.get_dummies() cui_onehot = master['CUI_desc'].str.join('|').str.get_dummies() # 拼接保留列与编码结果 result = pd.concat([master['annotations'], cat_onehot, cui_onehot], axis=1) # 输出验证 print(result)
特殊情况适配
如果你的categories和CUI_desc列存储的是字符串格式的列表(不是原生list类型),需要先加一步转列表的处理:
import ast master['categories'] = master['categories'].apply(ast.literal_eval) master['CUI_desc'] = master['CUI_desc'].apply(ast.literal_eval)
再运行核心处理逻辑即可。
内容的提问来源于stack exchange,提问作者Melderon
相关产品推荐
相关产品推荐

