Python pandas查找指定字符串单元格并选取其左右n个单元格的方法
pandas全表搜索指定字符串并提取匹配单元格左右相邻n列内容实现
核心逻辑
用pandas内置向量化方法即可高效完成,不需要写多层循环逐单元格判断,核心步骤:
- 全表做字符串匹配生成布尔掩码,定位所有匹配单元格的行列坐标
- 对每个匹配坐标做列边界截断,避免列索引超出DataFrame的合法范围
- 按截断后的列范围,提取对应行内目标单元格左右各n个单元格的内容
完整可运行代码
import pandas as pd # -------------------------- 测试数据与参数配置 -------------------------- # 示例DataFrame,可替换为实际业务数据 df = pd.DataFrame( [ ['订单A', '华东', '上海', '已签收', '2024-05-01', '快递员张X'], ['订单B', '华北', '异常件', '北京', '2024-05-02', '快递员李X'], ['订单C', '华南', '广州', '已发货', '异常件', '2024-05-03'], ['订单D', '异常件', '深圳', '已揽收', '2024-05-04', '快递员王X'] ], columns=['订单号', '大区', '城市', '物流状态', '更新时间', '配送员'] ) # 要搜索的目标字符串 target_text = "异常件" # 目标单元格左右各取的相邻单元格数量 n = 1 # -------------------------- 核心匹配提取逻辑 -------------------------- result = [] # 全表转字符串后做匹配,兼容非字符串类型列,空值直接判定为不匹配 match_mask = df.astype(str).apply(lambda col: col.str.contains(target_text, na=False)) # 拿到所有匹配单元格的(行索引位置, 列索引位置) match_coords = list(zip(*match_mask.values.nonzero())) for row_pos, col_pos in match_coords: # 计算左右边界,越界则自动截断到首尾列 left_bound = max(0, col_pos - n) right_bound = min(df.shape[1] - 1, col_pos + n) # 提取对应范围的单元格内容 extracted = df.iloc[row_pos, left_bound : right_bound + 1] result.append( { "匹配单元格坐标": (df.index[row_pos], df.columns[col_pos]), "提取的相邻单元格内容": extracted.to_dict() } ) # 打印查看结果 for item in result: print(item)
关键配置说明
- 若需要精确完全匹配字符串,而非包含匹配,把代码里的
str.contains替换为str.fullmatch即可 - 若需要忽略大小写匹配,给
str.contains/str.fullmatch传入参数case=False - 若需要按正则规则匹配,直接在
str.contains里写对应正则表达式即可,方法默认支持正则匹配 - 边界场景自动兼容:如果匹配单元格在首列,左侧不足n个单元格时会自动从第一列开始提取;在尾列时右侧不足n个单元格会自动提取到最后一列,不会抛出索引越界错误
内容的提问来源于stack exchange,提问作者seps
相关产品推荐
相关产品推荐

