Pandas如何判断列表元素存在于另一列表实现DataFrame关联
Pandas实现两个DataFrame拆分词列表的交集匹配
你已经提前完成name字段拆分得到splitted_name列,核心判断逻辑是两个词列表是否存在至少1个公共元素,根据数据量大小可以选择以下两种实现方案:
方案1:万级以内小数据量,直接交叉匹配(代码最简)
数据量不大的时候不需要做复杂优化,直接生成两个表的笛卡尔积逐行判断交集即可,代码易读易调试:
# 交叉合并两个表,相同列名加后缀区分来源 cross_merge = df_2.merge(df_1, how="cross", suffixes=("_df2", "_df1")) # 判断两个splitted_name列表是否存在非空交集,存在则标记为匹配 cross_merge["is_matched"] = cross_merge.apply( lambda row: len(set(row["splitted_name_df1"]) & set(row["splitted_name_df2"])) > 0, axis=1 ) # 过滤匹配结果,即可得到每条df_2数据对应的df_1 id matched_res = cross_merge[cross_merge["is_matched"]][ ["id_df2", "name_df2", "id_df1", "name_df1"] ]
用你给出的示例数据运行后,会得到Alone in the jungle remastered匹配到df_1中Alone in the jungle的对应id,Goodbye my love无匹配结果,符合预期。
注意:如果拆分前没有做统一小写处理,建议先执行
df["splitted_name"] = df["name"].str.lower().str.split()统一大小写,避免因大小写差异导致漏匹配。如果需要排除"the"、"in"这类无意义停用词,可以在拆分后加一步停用词过滤,匹配准确率会更高。
方案2:十万级以上大数据量,倒排索引优化(性能最优)
如果数据量较大,交叉合并生成的笛卡尔积会占用过多内存甚至直接报错,这时候用倒排索引的方式可以把时间复杂度降到线性级,运行效率高很多:
from collections import defaultdict # 第一步:构建倒排索引,key为拆分后的单词,value为包含该单词的所有df_1的id集合 word_index = defaultdict(set) for df1_id, word_list in zip(df_1["id"], df_1["splitted_name"]): for word in word_list: word_index[word].add(df1_id) # 第二步:遍历df_2的词列表,直接从索引中取匹配的df_1 id def find_match_ids(word_list): match_ids = set() for word in word_list: match_ids.update(word_index.get(word, set())) return list(match_ids) if match_ids else None df_2["matched_df1_id_list"] = df_2["splitted_name"].apply(find_match_ids)
如果单条df_2数据匹配到多个df_1的id,结果会以列表形式存储在matched_df1_id_list列中,你可以后续根据交集词数量、词权重等规则进一步筛选出最匹配的单条记录。
内容的提问来源于stack exchange,提问作者SalvaHH
相关产品推荐
相关产品推荐

