如何在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
相关产品推荐
相关产品推荐

