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

Pandas中基于连续相邻数字匹配的DataFrame筛选问题

Pandas中基于连续相邻数字匹配的DataFrame筛选问题

你好,我完全理解你的需求了:你需要从df2里筛选出这样的行——该行的数字列(Num1到Num6)中,存在至少3个连续相邻的数字,且这3个数字都来自df1那一行的6个数字集合里。之前你写的代码只是统计了交集的数量,没考虑「连续相邻」这个核心条件,所以达不到预期效果。

下面我会针对这个需求给出具体的解决方案,我们一步步来:

第一步:准备数据与目标集合

首先先把你的原始数据加载好,同时提取df1里的数字作为目标集合,方便快速判断某个数字是否属于我们要找的范围:

import pandas as pd

# 你的原始数据
df1 = pd.DataFrame([[2,4,6,8,9,10]], columns=['Num1','Num2','Num3','Num4','Num5','Num6'])
df2 = pd.DataFrame([[100,1,2,4,5,6,8],
[87,1,6,20,22,23,34],
[99,1,12,13,34,45,46],
[64,1,10,14,29,32,33],
[55,1,22,13,23,33,35],
[66,1,6,7,8,9,10],
[77,1,2,3,5,6,8],
[811,1,2,5,6,8,10],
[118,1,7,8,22,44,56],
[117,1,66,44,47,87,91],
[299,2,4,7,20,21,22],
[187,3,6,10,12,25,39],
[199,4,12,24,34,56,57],
[264,3,7,8,9,10,33],
[50,6,8,10,23,33,35],
[212,4,6,12,18,19,20],
[45,3,7,23,35,56,88],
[801,1,2,4,6,28,39],
[258,2,3,4,9,10,41],
[220,5,6,10,27,57,81]],
columns=['Id', 'Num1','Num2','Num3','Num4','Num5','Num6'])

# 提取df1的数字集合
target_nums = set(df1.iloc[0])

第二步:编写判断函数,检查连续匹配

我们需要写一个函数,输入一行的数字列,判断其中是否存在至少3个连续相邻的数字都属于target_nums:

def has_consecutive_match(row):
    # 把行的数字列转成列表
    num_list = row.tolist()
    # 遍历所有可能的连续3个数字的起始位置(6个数字的话,起始索引范围是0到3)
    for i in range(len(num_list) - 2):
        # 取出连续的3个数字
        trio = num_list[i:i+3]
        # 判断这三个数字是否都在目标集合里
        if all(num in target_nums for num in trio):
            return True
    return False

第三步:应用函数筛选df2

接下来把这个函数应用到df2的数字列上,生成筛选掩码,最终得到符合要求的结果:

# 对df2的Num1到Num6列应用判断函数
mask = df2.loc[:, 'Num1':'Num6'].apply(has_consecutive_match, axis=1)
# 筛选符合条件的行
result = df2[mask]

现在打印result就能得到你预期的输出:

print(result)

输出结果如下:

Id  Num1  Num2  Num3  Num4  Num5  Num6
5    66     1     6     7     8     9    10
7   811     1     2     5     6     8    10
13  264     3     7     8     9    10    33
14   50     6     8    10    23    33    35
17  801     1     2     4     6    28    39
18  258     2     3     4     9    10    41
19  220     5     6    10    27    57    81

补充:如果需要匹配df1中的连续子序列

如果你实际需求是df1里的连续数字序列完整出现在df2的行中(比如df1的[2,4,6]作为连续序列出现在df2里),可以调整判断逻辑如下:

# 提取df1的数字序列
target_seq = df1.iloc[0].tolist()
# 生成所有长度≥3的连续子序列
target_subseqs = []
for length in range(3, len(target_seq)+1):
    for i in range(len(target_seq) - length + 1):
        target_subseqs.append(tuple(target_seq[i:i+length]))

def has_exact_consecutive_subseq(row):
    num_list = row.tolist()
    # 生成该行所有长度≥3的连续子序列
    row_subseqs = []
    for length in range(3, len(num_list)+1):
        for i in range(len(num_list) - length + 1):
            row_subseqs.append(tuple(num_list[i:i+length]))
    # 判断是否有匹配的子序列
    return any(subseq in target_subseqs for subseq in row_subseqs)

# 应用筛选
mask = df2.loc[:, 'Num1':'Num6'].apply(has_exact_consecutive_subseq, axis=1)
result = df2[mask]

这个版本会筛选出包含df1中连续子序列(比如[2,4,6]、[8,9,10])的行。

备注:内容来源于stack exchange,提问作者user20250014

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:25:27