假设我有这个Pandas数据帧df
:
A B
0 100 [2, 18, 20]
1 200 [3, 17]
2 200 [3, 17]
...
其中列CCD_ 2是整数类型并且列B
是整数列表类型。假设我想数一下有多少重复的行。在这个3行的小示例中,有一行是重复的。所以df.duplicated().sum()
应该为这个小例子输出1
。但不知何故,每当我执行命令时,它都会抛出一个错误:
TypeError: unhashable type: 'list'
我如何理解为什么会发生这种情况,是因为行中的每个值都成为一个隐藏字典的键,而一个值将计算数据帧中存在多少这样的键。但由于类型列表不能是字典中的键,因此这将失败。不确定我是否理解正确。
但不管怎样,有人知道一种变通方法吗?可以找到在包含列表的列的数据帧中有多少重复项?如何移除它们?
将列表转换为字符串然后删除列表会有帮助吗?虽然我稍后会再次使用该列表,所以当我只有字符串时,返回列表可能会很麻烦。非常感谢您的帮助。非常感谢。
首先,在一个系列的单元格中有一个列表可能不是很酷,会阻碍一些快速计算等。
其次,您可以将这些列表临时强制转换为可哈希的元组,检测重复,并从原始帧中删除。
所以
df.loc[~df.assign(B=df.B.apply(tuple)).duplicated()]
样品运行:
In [561]: df
Out[561]:
A B
0 1 [300]
1 3 [300, 500]
2 1 [300]
3 3 [200, 0]
In [562]: df.assign(B=df.B.apply(tuple))
Out[562]:
A B
0 1 (300,)
1 3 (300, 500)
2 1 (300,)
3 3 (200, 0)
In [563]: df.assign(B=df.B.apply(tuple)).duplicated()
Out[563]:
0 False
1 False
2 True
3 False
dtype: bool
In [564]: df.loc[~df.assign(B=df.B.apply(tuple)).duplicated()]
Out[564]:
A B
0 1 [300]
1 3 [300, 500]
3 3 [200, 0]