Pandas DataFrame中按指定顺序查找数组匹配序列的索引
实现方案
你需要在token_2中查找与对应行token_1元素、顺序、连续性完全一致的子片段索引,原逻辑仅做了单元素存在性判断,没有校验连续顺序,用滑动窗口匹配即可实现需求。
完整代码
import pandas as pd # 构造示例DataFrame data = {'token_1': [['cat', 'run','today'],['dog', 'eat', 'meat']], 'token_2': [['cat', 'in', 'the' , 'morning','cat', 'run', 'today', 'very', 'quick', 'cat','today', 'jump', 'and', 'run', 'run', 'cat', 'today'],['dog', 'eat', 'meat', 'chicken', 'from', 'bowl','dog','see','meat','eat']]} df = pd.DataFrame(data) def match_sequence(pattern, search_list): # 匹配串长度 pattern_len = len(pattern) list_len = len(search_list) # 遍历所有可能的连续窗口起点 for start_idx in range(list_len - pattern_len + 1): # 截取等长连续子序列做完全匹配 if search_list[start_idx : start_idx + pattern_len] == pattern: return list(range(start_idx, start_idx + pattern_len)) # 无匹配返回空列表 return [] # 逐行执行匹配 result = [match_sequence(a, b) for a, b in zip(df['token_1'], df['token_2'])] print(result)
运行后输出结果为:[[4, 5, 6], [0, 1, 2]],和预期结果完全一致。
逻辑说明
- 采用固定长度滑动窗口遍历
token_2,窗口长度和对应行的token_1长度相等 - 每次截取窗口内的连续子序列,和
token_1做全等判断,只有元素、顺序完全一致才判定为匹配 - 如果单行存在多个符合要求的匹配片段,只需要把函数内的
return逻辑改为将匹配结果追加到结果列表,即可返回所有匹配段的索引 - 边界场景自动兼容:如果
token_1长度大于token_2,函数会直接返回空列表,不会触发索引报错
内容的提问来源于stack exchange,提问作者Rory
相关产品推荐
相关产品推荐

