提问人:mbgzoo 提问时间:11/8/2023 更新时间:11/9/2023 访问量:24
使用 BaseCompareFeature 比较 python 记录链接库中嵌套列表的元素
Comparing elements of nested lists in python's record linkage library using BaseCompareFeature
问:
我正在使用 python 的记录链接库来识别两个不同数据帧中的匹配实体(为简单起见,我们将它们称为 dfA 和 dfB)。
我想用于比较的功能之一包含嵌套列表,即两个数据帧中每个数据帧中的一列都包含元素列表。我们称此列为 col_X,并将这些嵌套列表的元素称为 e_i。 (在我的应用程序中,e_i是以 int 类型出现的标识符。
我特别想做的是计算每个比较对的列表e_i数(以 dfA col_X为单位,这些数与 dfB col_X列表中e_i元素相同。
我的基本想法是创建一个系列对象,该对象使用集合运算符为我提供每个比较对中两个列表共有的元素数。像这样的东西:
(dfA.col_x.apply(set) & dfB.col_x.apply(set)).apply(len).
在阅读了文档(https://recordlinkage.readthedocs.io/en/latest/ref-compare.html#recordlinkage.base.BaseCompareFeature)之后,我明白了原则上我必须使用 BaseCompareFeature 并创建自己的函数。
然后,我尝试执行以下操作:
class CompareElements(BaseCompareFeature):
def __init__(self, left_on, right_on, *args, **kwargs):
super(CompareElements, self).__init__(left_on, right_on, *args, **kwargs)
def _compute_vectorized(self, s1, s2):
sets_s1 = s1.apply(set)
sets_s2 = s2.apply(set)
sim = (sets_s1 & sets_s2).apply(len)
return sim
这种方法的问题似乎是我无法将集合运算符应用于序列对象 sets_s1 和 sets_s2。
同时,在函数内迭代似乎也不是一种选择,因为比较只是在以后使用 compare 和 compute 函数完成的:
comparer = rl.Compare([
CompareElements('col_X', 'col_X', label='label_X')
])
comparison_vectors = comparer.compute(pairs, dfA, dfB)
不幸的是,文档中的示例并未涵盖我的用例。
关于我如何解决这个问题的任何想法都非常感谢。
请注意,我正在使用多个其他比较功能,这就是为什么如果可能的话,我想坚持使用记录链接库来完成此任务。
答:
我已经找到了问题的解决方案。
诀窍是使用列表推导式并将它们转换为 Pandas Series,以便 CompareElementsclass 将它们接受为输出。
因此,我计算两个比较列表共享的元素份额所做的工作如下:
class CompareElements(BaseCompareFeature):
def __init__(self, left_on, right_on, *args, **kwargs):
super(CompareElements, self).__init__(left_on, right_on, *args, **kwargs)
def _compute_vectorized(self, s1, s2):
L1 = pd.Series([list(set(x+y)) for x, y in zip(s1, s2)]).apply(len)
L2 = pd.Series([list(set(x) & set(y)) for x, y in zip(s1, s2)]).apply(len)
sim = L2/L1
return sim
评论