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

如何保留DataFrame中包含特定字符串列表的行?

问题描述

我有一个包含level列的DataFrame:

level 

0                     HH
1                     FF
2                     FF
3       C,NN-FRAC,W-PROC
4                    C,D
              ...       
8433            C,W-PROC
8434                 C,D
8435                   D
8436                 C,Q
8437                C,HH

需要仅保留level列中**至少包含一个指定字符串(逗号分隔的独立元素)**的行,指定字符串列表如下:

searchfor = ['W','W-OFFSH','W-ONSH','W-GB','W-PROC','W-NGTC','W-TRANS','W-UNSTG','W-LNGSTG','W-LNGIE','W-LDC','X','Y','LL','MM','MM – REF','MM – IMP','MM – EXP','NN','NN-FRAC','NN-LDC','OO'] 

预期结果(上述数据片段中):

level 
3       C,NN-FRAC,W-PROC
8433            C,W-PROC

尝试了以下两种方法但均未得到预期结果:

# 方法1:直接传入列表
df = df[df['industrytype'].str.contains(searchfor)]

# 方法2:用逗号拼接列表
df = df[df['industrytype'].str.contains(','.join(searchfor))]
解决方案

问题原因

  1. str.contains() 不支持直接传入列表作为参数,第一种方法会直接报错;
  2. 第二种方法用逗号拼接列表生成的字符串,会被当作正则表达式匹配任意包含子串的情况(比如HHW会因为包含W被误匹配),无法准确匹配逗号分隔的独立元素。

正确实现方式

方式1:利用集合快速匹配(推荐,效率更高)

先把searchfor转为集合,再对每行的level值按逗号分割,检查是否有元素在集合中:

search_set = set(searchfor)
# 过滤条件:分割后的元素列表与search_set有交集
df_filtered = df[df['level'].str.split(',').apply(lambda x: bool(set(x) & search_set))]

方式2:正则精确匹配

将searchfor中的元素转为正则表达式,用|分隔,同时添加边界匹配(确保是逗号分隔的独立元素):

import re
# 对特殊字符转义,避免正则语法冲突
pattern = '|'.join(re.escape(item) for item in searchfor)
# 匹配规则:元素位于字符串开头/逗号之后,结尾为逗号/字符串末尾
regex = fr'(?<=^|,)({pattern})(?=,|$)'
df_filtered = df[df['level'].str.contains(regex, regex=True)]

结果验证

运行上述任意一种方法,都会得到预期的过滤结果,仅保留level列中包含指定独立元素的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:42