
本文介绍如何高效筛选 pandas dataframe 中同时包含“software”和“package”(不区分大小写)的列名,无需复杂正则表达式,仅用字符串向量化方法即可精准匹配。
本文介绍如何高效筛选 pandas dataframe 中同时包含“software”和“package”(不区分大小写)的列名,无需复杂正则表达式,仅用字符串向量化方法即可精准匹配。
在数据预处理或探索性分析中,常需根据列名语义动态选取列——例如提取所有与“软件包”相关的列(如 'Software Package'、'Local Software Packages')。此时,要求列名同时包含两个关键词(如 software 和 package),而非任一匹配。若使用 regex='software|package',会返回含任一词的列,导致结果过宽;而正则表达式实现“同时包含”需使用正向先行断言(如 (?=.*software)(?=.*package)),既难读又易出错。
更简洁、高效且可读性强的做法是:利用 Pandas 的 Series.str.contains() 方法生成两个布尔掩码,再通过逻辑与(&)组合条件:
# 创建布尔掩码:列名是否包含 'software'(不区分大小写)
m1 = df.columns.str.contains('software', case=False)
# 创建布尔掩码:列名是否包含 'package'(不区分大小写,自动匹配 'packages')
m2 = df.columns.str.contains('package', case=False)
# 同时满足两个条件的列
filtered_df = df.loc[:, m1 & m2]
✅ 优势说明:
一款AI图像与设计工具,主要用于将文本渲染为图片并返回临时本地文件路径,支持可选的 data URI。适用于 Clawhub 或 Codex,用于将纯文本或带样式的文本进行转换,适合需要提升相关任务效率的用户。
- case=False 自动覆盖大小写变体(Software/SOFTWARE/software);
- 'package' 可匹配 package、packages、Packaging 等(因 contains 是子串匹配,非全词匹配);
- 无需编写正则,避免转义、分组或先行断言等复杂语法;
- 向量化操作,性能优于循环或 apply()。
? 仅获取列名(不返回数据):
selected_columns = df.columns[m1 & m2].tolist() # 输出示例:['Local Software Packages', 'Software XYZ Packages', 'Software Package']
⚠️ 注意事项:
- 若需严格匹配完整单词(如排除 'packaged' 或 'softwarex'),应改用正则并启用单词边界 \b,例如:
m1 = df.columns.str.contains(r'\bsoftware\b', case=False, regex=True) m2 = df.columns.str.contains(r'\bpackage\b', case=False, regex=True)
- str.contains() 默认对 NaN 列名返回 False,若列名含空值或缺失字符串,结果仍安全;
- 此方法适用于任意数量的关键词组合,扩展为 m1 & m2 & m3 即可支持三重条件。
综上,面对“多关键词共现”的列筛选任务,优先推荐布尔掩码组合方案——它兼具清晰性、健壮性与执行效率,是 Pandas 字符串操作的最佳实践之一。










