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

如何在Pandas DataFrame中对比两列表列并移除重复元素?

问题原因

你写的代码错误在于直接遍历整个df['group1']列(这是一个Series对象,不是每行的列表),同时判断条件里的df['group2']也是整个列,而非当前行对应的group2列表。而且列表是不可哈希类型,无法直接用于in判断的容器对比,所以抛出TypeError: unhashable type: 'list'。

解决方法

有两种高效的方式实现需求:

方法1:使用apply逐行处理

利用apply按行遍历DataFrame,针对每行的group1和group2列表做过滤:

import pandas as pd

group1 = [['John', 'Mark'], ['Ben', 'Johnny'], ['Sarah', 'Daniel']]
group2 = [['Aya', 'Boa'], ['Mab', 'Johnny'], ['Sarah', 'Peter']]

df = pd.DataFrame({'group1':group1, 'group2':group2})

# 逐行过滤group1中存在于对应行group2的元素
df['group1'] = df.apply(lambda row: [name for name in row['group1'] if name not in row['group2']], axis=1)

print(df)

方法2:使用zip结合列表推导式

直接遍历group1和group2列的对应元素,用列表推导式完成过滤,这种方式性能优于apply:

import pandas as pd

group1 = [['John', 'Mark'], ['Ben', 'Johnny'], ['Sarah', 'Daniel']]
group2 = [['Aya', 'Boa'], ['Mab', 'Johnny'], ['Sarah', 'Peter']]

df = pd.DataFrame({'group1':group1, 'group2':group2})

# 遍历两列的对应列表进行过滤
df['group1'] = [[name for name in g1 if name not in g2] for g1, g2 in zip(df['group1'], df['group2'])]

print(df)
运行结果

两种方法都会得到期望的输出:

group1           group2
0  [John, Mark]    [Aya, Boa]
1        [Ben]  [Mab, Johnny]
2      [Daniel]  [Sarah, Peter]

内容的提问来源于stack exchange,提问作者amnesic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:36:20