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

如何在Pandas DataFrame的列表类型列中搜索指定字符串

问题根因

str.contains()等字符串处理方法仅支持值为字符串类型的列,你当前的hashtagsMessage列每行存储的是Python列表,常规的字符串匹配、等值判断都只会作用于列表对象本身,不会深入检查列表内部的元素,所以得不到正确结果。

可行解决方案

方案1:apply+成员判断(最适合完全匹配场景,代码最简)

直接对每行的列表做成员匹配,判断目标字符串是否在列表内:

# 生成匹配掩码,True代表该行列表包含#BTS
mask = df['hashtagsMessage'].apply(lambda x: '#BTS' in x)
# 筛选符合条件的行
result = df[mask]

针对你的示例数据,返回的结果仅包含post_5行,符合完全匹配的要求。

注意:如果列中存在非列表类型的空值/异常值,可以在判断前加类型校验避免报错,写法调整为:

mask = df['hashtagsMessage'].apply(lambda x: isinstance(x, list) and '#BTS' in x)

方案2:模糊匹配列表内的标签元素

如果不需要完全匹配,只要标签中包含指定子串就算命中,可以用如下写法:

# 只要列表内任意标签包含#BTS子串就算匹配
mask = df['hashtagsMessage'].apply(lambda x: any('#BTS' in tag for tag in x))
result = df[mask]

这个写法会同时命中#BTS和#BTSatUNGA,对应示例数据的post_3和post_5行。

方案3:explode拆分法(适合大数据量场景,性能更高)

如果你的DataFrame数据量很大,用apply的遍历效率较低,可以用pandas原生的explode方法做向量化处理:

# 将列表列拆分为单行单标签,保留原索引
exploded = df.explode('hashtagsMessage')
# 筛选符合匹配条件的行,取原索引去重
match_index = exploded[exploded['hashtagsMessage'] == '#BTS'].index.unique()
# 从原表中提取匹配行
result = df.loc[match_index]

内容的提问来源于stack exchange,提问作者Aquiles Páez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:36:04