基于两列中的模糊匹配合并两个数据帧
Merge two dataframes based on fuzzy-matches in two columns
我有 2 个数据框,我正尝试根据 ID 和辅助 ID 合并它们。以下是两个数据帧的示例:
First ID Second ID Company
10056526008010 0.000000e+00 Company A
10022337820851 8.152050e+11 Company B
722337820853 8.152050e+11 Company C
10056526008010 0.000000e+00 Company E
10022337820851 6.290250e+11 Company D
First ID Second ID Company Availability
878968000512 0.000000e+00 Company F Y
10022337820851 8.152050e+11 Company B Y
10022337820851 8.152050e+11 Company B Y
722337820853 8.152050e+11 Company C N
10056526008010 0.000000e+00 Company E N
10056526008010 0.000000e+00 Company G N
10022337820851 6.290250e+11 Company D Y
我希望能够根据第一个 ID 的匹配进行合并,然后检查次要 ID 是否匹配,如果匹配则应合并,如果不匹配则不应合并是(我怀疑需要内部合并)。如果 Secondary ID 为 0,则应进行公司名称的模糊匹配。有什么办法吗?所需的输出如下所示:
First ID Second ID Company Availability
10022337820851 8.152050e+11 Company B Y
722337820853 8.152050e+11 Company C N
10056526008010 0.000000e+00 Company E N
10056526008010 0.000000e+00 Company G N
10022337820851 6.290250e+11 Company D Y
这样,首先根据第一个 ID 匹配 2 个数据帧,然后使用第二个 ID 检查重复项,如果第二个 ID 为 0,则进行基于公司的类似匹配。如果 Second ID 或 Company 没有匹配项,则不会对该行进行合并。
让dataframes为df1
和df2
然后你可以先在id上使用merge
然后过滤辅助id为0的情况:
merged = df1.merge(df2, on=['First ID', 'Second ID'], suffixes=('_left', '_right'))
mask = fuzzy_match(merged['Company_left'], merged['Company_right']) | merged['Second ID_left'] != 0
merged[mask]
这里 fuzzy_match
是一个接受两个系列和 returns 布尔系列或数组的函数。
我有 2 个数据框,我正尝试根据 ID 和辅助 ID 合并它们。以下是两个数据帧的示例:
First ID Second ID Company
10056526008010 0.000000e+00 Company A
10022337820851 8.152050e+11 Company B
722337820853 8.152050e+11 Company C
10056526008010 0.000000e+00 Company E
10022337820851 6.290250e+11 Company D
First ID Second ID Company Availability
878968000512 0.000000e+00 Company F Y
10022337820851 8.152050e+11 Company B Y
10022337820851 8.152050e+11 Company B Y
722337820853 8.152050e+11 Company C N
10056526008010 0.000000e+00 Company E N
10056526008010 0.000000e+00 Company G N
10022337820851 6.290250e+11 Company D Y
我希望能够根据第一个 ID 的匹配进行合并,然后检查次要 ID 是否匹配,如果匹配则应合并,如果不匹配则不应合并是(我怀疑需要内部合并)。如果 Secondary ID 为 0,则应进行公司名称的模糊匹配。有什么办法吗?所需的输出如下所示:
First ID Second ID Company Availability
10022337820851 8.152050e+11 Company B Y
722337820853 8.152050e+11 Company C N
10056526008010 0.000000e+00 Company E N
10056526008010 0.000000e+00 Company G N
10022337820851 6.290250e+11 Company D Y
这样,首先根据第一个 ID 匹配 2 个数据帧,然后使用第二个 ID 检查重复项,如果第二个 ID 为 0,则进行基于公司的类似匹配。如果 Second ID 或 Company 没有匹配项,则不会对该行进行合并。
让dataframes为df1
和df2
然后你可以先在id上使用merge
然后过滤辅助id为0的情况:
merged = df1.merge(df2, on=['First ID', 'Second ID'], suffixes=('_left', '_right'))
mask = fuzzy_match(merged['Company_left'], merged['Company_right']) | merged['Second ID_left'] != 0
merged[mask]
这里 fuzzy_match
是一个接受两个系列和 returns 布尔系列或数组的函数。