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

如何判断Pandas列中是否存在列表中的任一子串?

问题:如何用子串列表匹配DataFrame列并标记匹配行?

需求:给定一个子串列表,找出DataFrame某列中包含列表中至少一个子串的行,生成新列Check,匹配到则值为'True',否则为空。

已实现单个子串匹配:

df.Col1.str.contains('text')

该代码可正确返回布尔值Series,但扩展到列表时遇到问题:

尝试的错误方法及问题

  1. 循环判断每个子串,返回多个Series:
list1 = ['text','Text','third','fourth']
for item in list1:
    df.Col1.str.contains(item)

问题:每次循环单独生成一个布尔Series,未合并为统一的匹配结果。

  1. 循环中用if判断Series,报错'The truth value of a Series is ambiguous':
for item in list:
    if df.Col1.str.contains(item) == True:
        df['Check'] = 'True'

问题:不能直接将整个布尔Series与True比较,Series包含多个布尔值,Python无法判断其整体真假,导致歧义报错。


正确实现方法

利用正则表达式的逻辑或特性,将子串列表拼接成正则模式,一次性完成匹配:

import pandas as pd

# 示例DataFrame
df = pd.DataFrame({'Col1': ['This has text', 'Another Text', 'No match here', 'Contains fourth']})
list1 = ['text','Text','third','fourth']

# 拼接正则模式:子串间用|分隔,表示匹配任意一个
pattern = '|'.join(list1)

# 生成Check列:匹配到则填'True',否则为空
df['Check'] = 'True'.where(df.Col1.str.contains(pattern), '')

代码说明

  • '|'.join(list1) 将列表转成'text|Text|third|fourth',正则中|表示“或”,即匹配任意一个子串。
  • df.Col1.str.contains(pattern) 返回布尔Series,标记每行是否匹配任一子串。
  • 'True'.where(条件, 替代值):当条件为True时保留'True',否则用空字符串填充,直接生成目标列。

如果需要不区分大小写匹配(比如同时匹配text和Text),可以给str.contains加参数case=False,此时列表里可以去掉重复的大小写子串:

pattern = '|'.join(['text','third','fourth'])
df['Check'] = 'True'.where(df.Col1.str.contains(pattern, case=False), '')

内容的提问来源于stack exchange,提问作者Stephen Juza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:36:24