如何在Pandas中用非apply方法筛选被指定字符串包含的列行
当然可以实现这个需求,而且完全能避开apply,用更高效的方式来处理!下面给你两种实用的方案:
方法1:列表推导式生成掩码(简单高效)
虽然不是Pandas原生的向量化API,但Python的列表推导式执行效率通常比apply高不少,代码也足够简洁:
import pandas as pd mystring = "abc" df = pd.DataFrame({"A": ["ab", "az"]}) # 生成布尔掩码,判断每个元素是否被mystring包含 mask = [x in mystring for x in df["A"]] # 筛选符合条件的行 result = df[mask] print(result)
输出结果:
A 0 ab
方法2:构造正则表达式,用str.contains实现原生向量化
如果想要完全依托Pandas的向量化能力,可以先生成目标字符串的所有连续子串,再用str.contains匹配这些子串,完美实现“列中字符串被指定字符串包含”的逻辑:
import pandas as pd import re def get_all_substrings(s): # 生成字符串s的所有连续子串 return [s[i:j+1] for i in range(len(s)) for j in range(i, len(s))] mystring = "abc" df = pd.DataFrame({"A": ["ab", "az"]}) # 生成带转义的正则匹配式(避免特殊字符干扰) substring_pattern = '|'.join(re.escape(sub) for sub in get_all_substrings(mystring)) # 用向量化的str.contains筛选行 result = df[df["A"].str.contains(substring_pattern)] print(result)
这个方案的优势在于完全利用Pandas的原生向量化优化,数据量越大,性能优势越明显。
内容的提问来源于stack exchange,提问作者Claudiu Creanga
相关产品推荐
相关产品推荐

