在记录链接库中检索匹配的记录 ID
Retrieving matched record ids in the recordlinkage library
我正在尝试这个例子:https://recordlinkage.readthedocs.io/en/latest/notebooks/data_deduplication.html
以下是代码片段:
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))
我现在想单独打印已经 matched.I 尝试列出 'matches' 的列名的 record_ids,但 record_id 不是一部分它,我似乎无法找到完成它的方法(我只想要单独的 record_ids)
有没有办法检索 record_ids,也许可以单独打印它或将其存储为列表或数组?
不要忘记 Pandas 数据框除了其数据列外还有一个 "index"。通常这是一个 "extra" 列的整数或字符串,但更复杂的索引是可能的,例如"multi-index" 由不止一列组成。
如果你 print(matches.head())
就可以看到这个。前两列的名称略有偏移,因为它们不是数据列;它们是索引本身的列。这个数据框索引实际上是一个包含两列的多索引:rec_id_1
和 rec_id_2
.
load_febrl
的结果将记录 ID 编码为 dfA
的索引。 Compare.compute
保留输入数据的索引:您总是可以期望原始数据的索引被保留为多索引。
可以使用 DataFrame.index
属性访问数据框本身的索引。这个 returns 一个 Index
object (of which MultiIndex
is a subclass) 又可以按如下方式转换:
Index.tolist()
:将其元素转换为list
; MultiIndex
变成 list
of tuple
s
Index.to_series()
:将其元素转换为Series
; MultiIndex
变成 Series
of tuple
s
Index.values
:作为 NumPy ndarray
访问底层数据; MultiIndex
成为 tuple
的 ndarray
。
Index.to_frame()
:转换为DataFrame
,索引列作为数据框列
因此您可以使用 matches.index
快速访问记录 ID,或使用 matches.tolist()
将它们导出到列表。
您还可以使用 matches.reset_index()
将索引列变回常规数据列。
这是使用 pandas 合并索引和 reset_index 属性
来完成答案的代码
这会将多索引转换为名为 level_0、level_1
的列
matches = matches.reset_index()
我们可以看到 level_0 列与 dfA
中的索引相同
matches.columns
dfA.index
现在按索引将其与 dfA 合并 level_0
import pandas as pd
matched_dfA=pd.merge(matches,dfA,left_on='rec_id_1',right_index=True)
查看结果
matched_dfA.head()
我正在尝试这个例子:https://recordlinkage.readthedocs.io/en/latest/notebooks/data_deduplication.html
以下是代码片段:
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))
我现在想单独打印已经 matched.I 尝试列出 'matches' 的列名的 record_ids,但 record_id 不是一部分它,我似乎无法找到完成它的方法(我只想要单独的 record_ids)
有没有办法检索 record_ids,也许可以单独打印它或将其存储为列表或数组?
不要忘记 Pandas 数据框除了其数据列外还有一个 "index"。通常这是一个 "extra" 列的整数或字符串,但更复杂的索引是可能的,例如"multi-index" 由不止一列组成。
如果你 print(matches.head())
就可以看到这个。前两列的名称略有偏移,因为它们不是数据列;它们是索引本身的列。这个数据框索引实际上是一个包含两列的多索引:rec_id_1
和 rec_id_2
.
load_febrl
的结果将记录 ID 编码为 dfA
的索引。 Compare.compute
保留输入数据的索引:您总是可以期望原始数据的索引被保留为多索引。
可以使用 DataFrame.index
属性访问数据框本身的索引。这个 returns 一个 Index
object (of which MultiIndex
is a subclass) 又可以按如下方式转换:
Index.tolist()
:将其元素转换为list
;MultiIndex
变成list
oftuple
sIndex.to_series()
:将其元素转换为Series
;MultiIndex
变成Series
oftuple
sIndex.values
:作为 NumPyndarray
访问底层数据;MultiIndex
成为tuple
的ndarray
。Index.to_frame()
:转换为DataFrame
,索引列作为数据框列
因此您可以使用 matches.index
快速访问记录 ID,或使用 matches.tolist()
将它们导出到列表。
您还可以使用 matches.reset_index()
将索引列变回常规数据列。
这是使用 pandas 合并索引和 reset_index 属性
来完成答案的代码这会将多索引转换为名为 level_0、level_1
的列matches = matches.reset_index()
我们可以看到 level_0 列与 dfA
中的索引相同matches.columns
dfA.index
现在按索引将其与 dfA 合并 level_0
import pandas as pd
matched_dfA=pd.merge(matches,dfA,left_on='rec_id_1',right_index=True)
查看结果
matched_dfA.head()