
本文介绍使用 pandas 实现多行顺序匹配(a→b→c→d)后,再在目标行及其上下邻行中查找 value_1 和 value_2 的完整教程,修正原始循环逻辑缺陷,提升鲁棒性与可读性。
本文介绍使用 pandas 实现多行顺序匹配(a→b→c→d)后,再在目标行及其上下邻行中查找 value_1 和 value_2 的完整教程,修正原始循环逻辑缺陷,提升鲁棒性与可读性。
在数据分析中,常需识别具有时空或逻辑顺序的跨行模式——例如:某值 a 出现在第 n 行,b 紧随其后出现在第 n+1 行,c 在 n+2 行,d 在 n+3 行;匹配成功后,进一步在 a 所在行(即第 n 行)及其上下邻行(n−1, n, n+1)中查找 value_1;一旦找到 value_1,再检查 value_2 是否存在于该 value_1 所在行的上下三行范围内(即 j−1, j, j+1 行)。原始代码存在多个关键问题:未处理索引越界、isin().any() 误用于标量判断、or 逻辑嵌套混乱导致漏匹配,且 display() 非通用函数。
以下为优化后的专业实现方案:
✅ 正确逻辑流程
-
外层遍历:用
for i in range(len(df) - 3)安全遍历所有可能的起始行(确保i+3不越界); -
四值顺序匹配:使用
in df.loc[i].values(比isin().any()更直观高效)验证a,b,c,d分别位于i,i+1,i+2,i+3行; -
定位 value_1:在
[i−1, i, i+1]三行内搜索value_1,需额外边界检查(如i−1 >= 0); -
定位 value_2:对每个
value_1所在行j,在[j−1, j, j+1]行内搜索value_2,同样校验索引合法性; - 结果输出:推荐返回匹配的起始行索引及对应子 DataFrame,便于后续分析。
? 完整可运行代码
import pandas as pd
# 示例数据(模拟 file.csv)
data = {
'A': [4, 1, 2, 5, 6, 1, 6, 12, 5, 4, 3],
'B': [5, 4, 11, 15, 7, 9, 38, 21, 18, 7, 4],
'C': [8, 12, 13, 29, 39, 10, 20, 7, 39, 10, 15],
'D': [16, 15, 15, 35, 12, 12, 36, 28, 33, 18, 19],
'E': [5, 22, 28, 7, 14, 20, 33, 35, 35, 19, 28],
'F': [44, 21, 33, 33, 16, 26, 34, 39, 36, 28, 38]
}
df = pd.DataFrame(data, index=range(1, 12)) # 行索引从1开始,对齐示例
# 参数定义
a, b, c, d = 7, 39, 10, 38
value_1, value_2 = 5, 21
matches = [] # 存储所有匹配结果(起始行索引 + value_1/value_2 位置)
for i in range(len(df) - 3): # 确保 i+3 合法
# 检查 a,b,c,d 顺序出现
if (a in df.iloc[i].values and
b in df.iloc[i+1].values and
c in df.iloc[i+2].values and
d in df.iloc[i+3].values):
# 在 [i-1, i, i+1] 行中查找 value_1(注意边界)
for j in [idx for idx in [i-1, i, i+1] if 0 <= idx < len(df)]:
if value_1 in df.iloc[j].values:
# 在 [j-1, j, j+1] 行中查找 value_2(再次校验边界)
for k in [idx for idx in [j-1, j, j+1] if 0 <= idx < len(df)]:
if value_2 in df.iloc[k].values:
matches.append({
'pattern_start_row': i,
'value1_row': j,
'value2_row': k,
'matched_rows': df.iloc[i:i+4] # a~d 所在四行
})
break # 找到一个 value_2 即可,避免重复添加
break # 找到一个 value_1 即可进入下一 pattern
# 输出结果
if matches:
print(f"共找到 {len(matches)} 组匹配:")
for m in matches:
print(f"\n▶ 模式起始行(a=7): 第 {m['pattern_start_row']} 行")
print(f" value_1=5 位于第 {m['value1_row']} 行")
print(f" value_2=21 位于第 {m['value2_row']} 行")
print(" 对应四行数据:")
print(m['matched_rows'])
else:
print("未找到符合全部条件的匹配模式。")⚠️ 关键注意事项
-
索引安全第一:原始代码中
df.loc[n-1]在n=0时会报错,必须用0 显式校验; -
避免
isin([x]).any()陷阱:df.loc[i].isin([x])返回布尔 Series,.any()判定是否存在True,但语义不如x in df.iloc[i].values直观,且iloc比loc更适合位置索引; -
or逻辑非问题根源:原始代码中or使用本身无误,但因嵌套过深、边界缺失和条件执行路径混乱,导致部分分支未被触发——根本在于控制流设计,而非运算符; -
性能提示:对超大数据集,可先用
df.stack().reset_index()构建值-行列映射表加速查找,但本例以清晰性优先。
该方案兼顾正确性、可维护性与教学性,适用于初学者理解 Pandas 行级逻辑匹配的核心范式。

















