You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:09:33