You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python/Pandas生成含指定文本的0/1标记列?

问题描述
  • 熟悉R语言,刚入门Python,需求是对包含指定文本的字符串标记为1,否则标记为0。
  • 单个关键词匹配可通过str.contains实现,但构建food列(需匹配A21、A23、A22、C12Q、C12G多个关键词)时多次尝试失败,遇到的问题包括:全0结果、语法错误、真值歧义等。
问题分析

针对你尝试的几次代码逐一分析问题:

  1. 第一次尝试:用for循环判断关键词是否在df["codes"]中,这里df["codes"]是Pandas Series,in操作符实际检查的是索引或列名,而非每个字符串元素的内容。且每次循环会覆盖food列的值,最终只会保留最后一个关键词的判断结果,导致全0。
  2. 第二次尝试:str.contains()默认接受正则表达式字符串,直接传入列表会触发错误,需要将多个关键词拼接成正则的"或"模式(用|分隔)。
  3. 第三次尝试:语法错误,列表推导式的写法不符合Python语法规范,同时未正确处理Series的元素级判断。
  4. 第四次尝试: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:45:49