如何在Pandas中按指定字符串的精确组合提取DataFrame行
解决方案
要精确筛选出sig列仅包含指定字符串(此处为301、302、303)的行,不管字符串的组合顺序,同时排除包含其他额外字符串的行,可按以下步骤实现:
定义允许的字符串集合:
allowed_sigs = {'301', '302', '303'}生成筛选掩码:
对sig列的每个值按空格分割,将分割后的字符串转为集合,判断该集合是否是允许集合的子集(即所有元素都属于允许列表,无额外字符串):mask = df['sig'].str.split().apply(lambda x: set(x).issubset(allowed_sigs))筛选DataFrame:
用掩码过滤出符合条件的行:result = df[mask]
完整代码示例
import pandas as pd df = pd.DataFrame() df['sig'] = ['301','302','303','405','405 409','302 301','303 301','405','560','309','301 302 303','303 304','305','305 304 303 302 301', '555','565','301 302 303 304'] df['val'] = [45,25,1,54,12,51,52,1,4,152,786,145,1,555,7595,77,89] allowed_sigs = {'301', '302', '303'} mask = df['sig'].str.split().apply(lambda x: set(x).issubset(allowed_sigs)) result = df[mask] print(result)
输出结果
sig val 0 301 45 1 302 25 2 303 1 5 302 301 51 6 303 301 52 10 301 302 303 786
说明
- 避免使用
str.contains这类模糊匹配方法,这类方法会误选包含目标字符串但同时带有其他额外字符串的行(比如301 302 303 304)。 - 利用集合的
issubset方法可以严格确保每行sig的所有元素都属于允许的集合,完全符合精确组合需求。
内容的提问来源于stack exchange,提问作者Sushil Kokil
相关产品推荐
相关产品推荐

