如何保留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))]
解决方案
问题原因
str.contains()不支持直接传入列表作为参数,第一种方法会直接报错;- 第二种方法用逗号拼接列表生成的字符串,会被当作正则表达式匹配任意包含子串的情况(比如
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
相关产品推荐
相关产品推荐

