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
相关产品推荐
相关产品推荐

