Pandas如何判断DataFrame行包含指定字符串而非精确匹配
问题说明
现有用于批量搜索Excel文件内容的函数仅支持精确匹配:只有当单元格内容和传入的搜索字符串完全相等时才会判定命中,无法识别单元格内容包含搜索词的场景。例如在内容为a quick brown fox的单元格中搜索fox时,现有函数无法返回匹配结果。
原实现代码如下:
def search_excel_files(file_list, search_term): #list of row indexes that contain the search term rows = {} for file in file_list: df = pd.read_excel("files/" + file) for row in df.iterrows(): if search_term in row[1].values: #get row index row_index = row[0] #add row index to dictionary rows = df.iloc[row_index].to_dict() return rows
问题根因
原判断逻辑search_term in row[1].values是直接判断搜索词是否为行值序列的成员,仅当某个单元格值完全等于搜索词时才会返回True,不会对单个单元格的内容做子串匹配。
除此之外原代码还有逻辑缺陷:每次匹配到行就直接覆盖rows变量,最终函数只会返回最后一个匹配到的行内容,无法收集所有匹配结果。
修改方法
调整判断逻辑为逐单元格做子串匹配,同时修复结果存储的逻辑缺陷,另外补充非字符串类型值的兼容处理,避免数字、日期、空值导致的匹配报错。
修改后的完整代码:
import pandas as pd def search_excel_files(file_list, search_term): # 按文件名存储所有匹配到的行 match_rows = {} for file in file_list: df = pd.read_excel("files/" + file) current_file_matches = [] for row_idx, row_content in df.iterrows(): # 逐单元格检查是否包含搜索词,空值直接跳过 is_matched = False for cell_val in row_content.values: # 跳过空值避免类型错误 if pd.isna(cell_val): continue # 统一转字符串后做子串判断 if search_term in str(cell_val): is_matched = True break if is_matched: current_file_matches.append(df.iloc[row_idx].to_dict()) # 当前文件存在匹配结果时存入总结果 if current_file_matches: match_rows[file] = current_file_matches return match_rows
关键修改点
- 替换原精确匹配逻辑:逐单元格将值转为字符串后,判断搜索词是否为单元格内容的子串,实现模糊包含匹配
- 修复原结果覆盖问题:按文件维度收集所有匹配到的行,不会丢失历史匹配结果
- 增加类型兼容:对空值、数字、日期等非字符串类型的单元格值做转义处理,避免运行报错
- 如果需要忽略大小写匹配,只需要把判断条件改为
search_term.lower() in str(cell_val).lower()即可
内容的提问来源于stack exchange,提问作者Ivory
相关产品推荐
相关产品推荐

