【问题标题】:Retrieving matched record ids in the recordlinkage library在记录链接库中检索匹配的记录 ID
【发布时间】:2018-09-18 19:15:16
【问题描述】:

我正在尝试这个例子:https://recordlinkage.readthedocs.io/en/latest/notebooks/data_deduplication.html

下面是sn-p的代码:

import recordlinkage
from recordlinkage.datasets import load_febrl1

dfA = load_febrl1()

# Indexation step
indexer = recordlinkage.Index()
indexer.block(left_on='given_name')
candidate_links = indexer.index(dfA)

compare_cl = recordlinkage.Compare()

compare_cl.exact('given_name', 'given_name', label='given_name')
compare_cl.string('surname', 'surname', method='jarowinkler', threshold=0.85, label='surname')
compare_cl.exact('date_of_birth', 'date_of_birth', label='date_of_birth')
compare_cl.exact('suburb', 'suburb', label='suburb')
compare_cl.exact('state', 'state', label='state')
compare_cl.string('address_1', 'address_1', threshold=0.85, 
label='address_1')

features = compare_cl.compute(candidate_links, dfA)
matches = features[features.sum(axis=1) > 3]
print(len(matches))

我现在想单独打印已匹配的记录 ID。我尝试列出“匹配”的列名,但记录 ID 不是其中的一部分,我似乎无法找到获取的方法它完成了(我只想要单独的record_ids)

有没有办法检索record_ids,或者单独打印或者将其存储为列表或数组?

【问题讨论】:

    标签: python record-linkage


    【解决方案1】:

    不要忘记,Pandas 数据框除了数据列之外还有一个“索引”。通常这是整数或字符串的单个“额外”列,但更复杂的索引是可能的,例如由多于一列组成的“多索引”。

    print(matches.head()) 可以看到这个。前两列的名称略有偏移,因为它们不是数据列;它们是索引本身的列。这个数据框索引实际上是一个包含两列的多索引:rec_id_1rec_id_2

    load_febrl 的结果将记录 ID 编码为dfA 的索引。 Compare.compute 保留输入数据的索引:您始终可以期望原始数据中的索引被保留为多索引。

    可以使用DataFrame.index 属性访问数据框本身的索引。这会返回一个Index object(其中MultiIndex is a subclass),然后可以按如下方式进行转换:

    • Index.tolist():转换为其元素的listMultiIndex 变为 listtuples
    • Index.to_series():转换为其元素的SeriesMultiIndex 变为 Seriestuples
    • Index.values:作为 NumPy 访问底层数据 ndarrayMultiIndex 成为 ndarraytuples。
    • Index.to_frame():转换为DataFrame,索引列作为数据框列

    因此您可以使用matches.index 快速访问记录ID,或使用matches.tolist() 将它们导出到列表。

    您还可以使用matches.reset_index() 将索引列转回常规数据列。

    【讨论】:

    • 非常感谢,这个解释正是我需要的。
    【解决方案2】:

    这是在 index 和 reset_index 属性上使用 pandas 合并来完成答案的代码

    这会将多索引转换为名为 level_0、level_1 的列

    matches = matches.reset_index()
    

    我们可以看到列 level_0 与 dfA 中的索引相同

    matches.columns 
    dfA.index
    

    现在按索引和 level_0 将其与 dfA 合并

    import pandas as pd
    matched_dfA=pd.merge(matches,dfA,left_on='rec_id_1',right_index=True)
    

    查看结果

    matched_dfA.head()
    

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多