DataFrame列表列求差异报错:TypeError: unhashable type: 'list'原因咨询
问题分析与解决
错误原因
你遇到的TypeError: unhashable type: 'list'有两个核心问题:
- 哈希性限制:列表是可变类型,不支持哈希运算。当你写
y not in x['B']时,Python会尝试将列表y作为哈希键去匹配x['B'](Pandas Series)的元素或索引,直接触发哈希错误。 - 逻辑偏差:你的列表推导式是遍历整个
A列的所有列表,判断每个列表是否不在整个B列中,这完全不是你想要的逐行计算对应列表差异的逻辑。
正确实现方式
要逐行计算A列和B列对应列表的差异(提取A中有但B中没有的元素),可以用以下两种方法:
方法1:保留元素顺序的逐行遍历
用apply指定axis=1逐行处理,确保元素顺序和原列表一致:
df['X1'] = df.apply(lambda row: [item for item in row['A'] if item not in row['B']], axis=1)
方法2:基于集合的快速计算(会丢失元素顺序)
如果不关心元素顺序,用集合的差集运算效率更高:
df['X1'] = [list(set(a) - set(b)) for a, b in zip(df['A'], df['B'])]
运行结果
执行上述代码后,DataFrame会新增X1列,结果如下:
NAME A B X1 0 JOHN [1, 2, 3] [2, 3, 4] [1] 1 MARY [2, 3, 4] [3, 4, 5] [2] 2 CHARLIE [3, 4, 5] [4, 5, 6] [3]
内容的提问来源于stack exchange,提问作者Lookasz_BL
相关产品推荐
相关产品推荐

