如何用Python/Pandas生成含指定文本的0/1标记列?
问题描述
- 熟悉R语言,刚入门Python,需求是对包含指定文本的字符串标记为1,否则标记为0。
- 单个关键词匹配可通过
str.contains实现,但构建food列(需匹配A21、A23、A22、C12Q、C12G多个关键词)时多次尝试失败,遇到的问题包括:全0结果、语法错误、真值歧义等。
问题分析
针对你尝试的几次代码逐一分析问题:
- 第一次尝试:用
for循环判断关键词是否在df["codes"]中,这里df["codes"]是Pandas Series,in操作符实际检查的是索引或列名,而非每个字符串元素的内容。且每次循环会覆盖food列的值,最终只会保留最后一个关键词的判断结果,导致全0。 - 第二次尝试:
str.contains()默认接受正则表达式字符串,直接传入列表会触发错误,需要将多个关键词拼接成正则的"或"模式(用|分隔)。 - 第三次尝试:语法错误,列表推导式的写法不符合Python语法规范,同时未正确处理Series的元素级判断。
- 第四次尝试:
df["All CP Classifications"].str.contains(i)返回的是布尔Series,直接用于if判断时,因Series包含多个布尔值,Pandas无法确定整体真值,因此抛出"真值歧义"错误。
解决方案
核心思路
- 多关键词匹配:将关键词列表拼接成正则表达式(
关键词1|关键词2|...),传入str.contains()实现任意匹配。 - 布尔值转0/1:用
.astype(int)将str.contains()返回的布尔Series转为0/1整数列。 - 统一处理所有标记列,保持逻辑一致。
完整代码
import pandas as pd codes = ["G06Q0030020000 | G06Q0010040000 | G06Q0030018000 | G06Q0030060000 | G06Q0030060700 | G06Q0030060900", "C12Y0301010040 | A23L0015250000 | A23L0027600000", "A61B0018040000", "C07C0213080000 | C07C0051373000 | A61P0005000000", "B82Y0005000000 | A61K0031418800 | A61K0051109300 | A61K0047689800 | A61K0039395000 | A61K0047500000 | A61P0035000000", "A61K0008898000 | A61Q0003000000 | A61Q0005020000 | A61Q0005120000 | A61Q0019000000 | C07F0007087900 | C07F0007088900 | C08G0077382000 | C08G0077440000 | C08G0077480000 | C08G0077540000 | C07F0007083800", "G06Q0010080000", "A61K0035740000 | A61K0009505700 | A23L0029284000 | A23L0033135000 | A23P0010300000", "A61K0035740000 | A61K0009505700 | A23L0029284000 | A23L0033135000 | A23P0010300000", "G06Q0010083300 | G06Q0030027800"] df = pd.DataFrame(codes, columns=["codes"]) # 直接指定列名,避免后续列名问题 # 处理多关键词的food列 for_food = ["A21","A23","A22","C12Q","C12G"] # 将关键词拼接成正则表达式,用|分隔表示"或" food_pattern = '|'.join(for_food) df["food"] = df["codes"].str.contains(food_pattern).astype(int) # 处理其他单关键词列,统一转成0/1 df["cosmetics"] = df["codes"].str.contains("A61K0008").astype(int) df["medical"] = df["codes"].str.contains("A61K0035").astype(int) df["banking"] = df["codes"].str.contains("G06Q").astype(int) print(df)
代码说明
'|'.join(for_food):将关键词列表拼接成A21|A23|A22|C12Q|C12G,正则中|表示匹配任意一个关键词。.astype(int):将布尔值True转为1,False转为0,符合需求的标记格式。- 初始化DataFrame时直接指定列名
codes,避免后续因列名为0导致的索引错误。
内容的提问来源于stack exchange,提问作者MelaniaCB
相关产品推荐
相关产品推荐

