我正在尝试从包含矩阵的元组列表中删除重复项。元组由两项组成:一个数字和一个相应的矩阵。 要被视为“重复”,数字和矩阵必须与列表中的另一个元组相同。
例如,我的初始列表的缩短版本如下(请注意最后两个元组是相同的,因此目标是删除其中一个):
[ ( 5.42,
c1 c2 c3 c4
r1 1 1 1 1
r2 1 0 0 0
r3 0 1 0 1
r4 0 0 0 0 ),
( 4.31,
c1 c2 c3 c4
r1 0 1 0 1
r2 0 1 1 1
r3 0 0 0 0
r4 1 0 0 1 ),
( 5.42,
c1 c2 c3 c4
r1 0 0 0 0
r2 0 0 1 0
r3 0 0 0 1
r4 1 1 1 1 ),
( 5.42,
c1 c2 c3 c4
r1 0 0 0 0
r2 0 0 1 0
r3 0 0 0 1
r4 1 1 1 1 ) ]
所需的输出将是 3 个元组的列表(而不是最初的 4 个),所有元组现在都是唯一的
[ ( 5.42,
c1 c2 c3 c4
r1 1 1 1 1
r2 1 0 0 0
r3 0 1 0 1
r4 0 0 0 0),
( 4.31,
c1 c2 c3 c4
r1 0 1 0 1
r2 0 1 1 1
r3 0 0 0 0
r4 1 0 0 1 ),
( 5.42,
c1 c2 c3 c4
r1 0 0 0 0
r2 0 0 1 0
r3 0 0 0 1
r4 1 1 1 1 ) ]
我的所有尝试都会导致以下两个错误之一:
ValueError:DataFrame 的真值不明确。 使用 a.empty() 、 a.bool()、 a.item() 或 a.all()
-或-
TypeError:DataFrame 对象是可变的,因此无法进行散列
当我检查传入元组列表的“类型”时,它返回。 所以,我很困惑我的错误消息引用了 DataFrames。
(注意,传入的列表是下面的‘tup_list’)
尝试示例1:
from itertools import groupby
deduped = [next (g) for k, g in groupby (sorted (tup_list), key = lambda tup: tup [:2] ) ]
尝试示例2:
new_tup_list = [ tuple (item) for item in tup_list ]
deduped = list (set (new_tup_list) )
尝试示例3:
deduped = list (set (map(tuple, tup_list) ) )
尝试示例 4:
from collections import OrderedDict
d.setdefault ( t[1], t )
deduped = list( d.values() )
尝试示例5:
deduped = set()
temp = [deduped.add((a,b)) for (a,b) in tup_list if (a,b) not in deduped]
lst
包含您的元组):
tmp = {}
for v, df in lst:
tmp[(v, str(df))] = (v, df)
print(list(tmp.values()))
打印:
[(5.42, c1 c2 c3 c4
r1 1 1 1 1
r2 1 0 0 0
r3 0 1 0 1
r4 0 0 0 0), (4.31, c1 c2 c3 c4
r1 0 1 0 1
r2 0 1 1 1
r3 0 0 0 0
r4 1 0 0 1), (5.42, c1 c2 c3 c4
r1 0 0 0 0
r2 0 0 1 0
r3 0 0 0 1
r4 1 1 1 1)]