如何在未知列/索引的DataFrame中查找含指定数字的列
解决方法
我们可以利用Pandas的矢量化字符串操作结合正则表达式高效实现需求,全程避免暴力遍历行列,核心是通过精确匹配判断每列是否存在目标数字。
步骤代码
- 先构建示例DataFrame:
import pandas as pd data = {'name1': ['1456, 1324, 4782', '5428'], 'name2': ['7832, 1477, 8092', ''], 'name3': ['9496', '7842, 8326'], 'name4': ['5532, 1886', '7732, 6512, 9044']} df = pd.DataFrame(data)
- 定义目标数字并构建精确匹配模式:
用正则的\b(单词边界)确保只匹配完整数字,避免出现找147时误匹配1477这类部分匹配的问题。
target = '1477' # 转成字符串,和列中数据格式保持一致 pattern = rf'\b{target}\b'
- 筛选包含目标数字的列:
# 对每列检查是否存在匹配行,返回标记列是否符合的布尔Series col_match_mask = df.apply(lambda col: col.str.contains(pattern, na=False)).any(axis=0) # 提取匹配的列名列表 matched_cols = col_match_mask[col_match_mask].index.tolist() print(matched_cols) # 输出: ['name2']
关键说明
- 高效性:
apply配合str.contains是Pandas优化过的矢量化操作,比手动循环行列效率高得多,完全适配大数据量场景。 - 空值处理:
na=False参数确保空字符串或缺失值直接被判定为不匹配,不会干扰结果。 - 精确匹配:正则
\b会匹配数字前后的非单词字符(逗号、空格、字符串开头/结尾),保证只命中完整的目标数字。
扩展测试
比如查找数字5428会得到['name1'],查找9044会得到['name4'],完全符合预期。
内容的提问来源于stack exchange,提问作者Luke M
相关产品推荐
相关产品推荐

