如何对两个DataFrame中含列表的对应列进行差集运算?
处理DataFrame中对应行的列表差集(保留顺序与重复项)
这问题我之前也碰到过——要按行匹配两个DataFrame,对每行的列表列做保留原顺序和重复项的差集过滤,而不是简单的集合差集。下面给你一个直接可用的Pandas解决方案:
步骤说明
我们的核心需求是:对每一行,保留DF1中B列列表里不在DF2对应行B列列表中的元素,同时维持原列表的顺序和剩余元素的重复次数。
代码实现
首先构造示例中的DataFrame:
import pandas as pd # 构造DF1 df1 = pd.DataFrame({ 'A': [111, 222, 333, 444], 'B': [ [12,13,14,14,15,13], [15,16,17,15,17,17,17], [17,14,16,14,14,17,17,16], [25,26,18,12,12,12,13,18] ] }) # 构造DF2 df2 = pd.DataFrame({ 'A': [111, 222, 333, 444], 'B': [ [12,14], [], [17,16], [25,18] ] })
接下来执行匹配和过滤:
# 按A列合并两个DataFrame,对齐行数据 merged_df = df1.merge(df2, on='A', suffixes=('_df1', '_df2')) # 定义过滤函数:保留df1列表中不在df2列表里的元素 def filter_list(row): exclude = set(row['B_df2']) # 转成集合提升查询效率 return [x for x in row['B_df1'] if x not in exclude] # 应用函数生成结果列 merged_df['B'] = merged_df.apply(filter_list, axis=1) # 提取需要的列得到最终结果 result_df = merged_df[['A', 'B']] print(result_df)
输出结果
运行后会得到你预期的输出:
A B 0 111 [13, 15, 13] 1 222 [15, 16, 17, 15, 17, 17, 17] 2 333 [14, 14, 14] 3 444 [26, 12, 12, 12, 13]
补充说明
- 把DF2的列表转成
set是为了提升元素查询的效率,尤其是当列表元素很多的时候。 - 如果你的DataFrame行数非常大,
apply可能不够高效,可以考虑用list comprehensions结合zip来优化,不过对于大多数日常场景,上面的代码已经足够好用了。
内容的提问来源于stack exchange,提问作者pylearner
相关产品推荐
相关产品推荐

