将基于模糊匹配的两个数据帧合并到两列中[重复]

问题描述 投票:0回答:1

我有两个要根据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是否匹配,如果匹配则应将其合并,如果不匹配则则不应该合并(i怀疑需要内部合并)。如果次要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,则进行基于Company的类似匹配。如果“第二个ID”或“公司”不匹配,则该行不合并。

python pandas merge fuzzy-comparison
1个回答
0
投票

让数据帧为df1df2,然后您可以先在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是一个接受两个序列并返回布尔序列或数组的函数。

© www.soinside.com 2019 - 2024. All rights reserved.