Python如何从单列提取值并基于目标列生成独立的二进制标识列
解决方案
核心问题原因
原来的匹配逻辑是子串包含匹配,'name' in 'business name'返回结果为True,所以会出现误判。你需要的是对reason字段按分隔符拆分后,匹配完整的独立枚举值,即可解决该问题。
实现代码
所有需要生成的列和对应关键词只需要维护一个映射字典即可,后续新增字段无需修改核心逻辑,不需要手动创建十多个列表:
import pandas as pd # 1. 定义关键词映射:键是生成的列名,值是对应要匹配的reason独立值 keyword_map = { "business_name": "business name", "name": "name", "individual_name": "individual_name", "DOB": "DOB" } # 2. 预处理reason字段,按逗号拆分、去空格、转小写后转集合,避免大小写、多余空格导致的匹配失败 df["reason_set"] = df["reason"].str.lower().str.split(r"\s*,\s*").apply(set) # 3. 批量生成所有匹配列 for col_name, target_key in keyword_map.items(): # 匹配时统一转小写,大小写不敏感 df[col_name] = df["reason_set"].apply(lambda x: "Yes" if target_key.lower() in x else "No") # 如果需要二进制0/1格式存储,把上面的"Yes"/"No"替换为1/0即可: # df[col_name] = df["reason_set"].apply(lambda x: 1 if target_key.lower() in x else 0) # 可选:删除中间生成的辅助列reason_set df = df.drop("reason_set", axis=1)
效果验证
以上代码运行后输出结果和你给出的期望效果完全一致:
| reason | business_name | name | individual_name | DOB |
|---|---|---|---|---|
| business name | Yes | No | No | No |
| name | No | Yes | No | No |
| business name | Yes | No | No | No |
| individual_name | No | No | Yes | No |
| DOB | No | No | No | Yes |
| Business name,name | Yes | Yes | No | No |
内容的提问来源于stack exchange,提问作者one_random_python_learner
相关产品推荐
相关产品推荐

