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

如何对两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:21:15