【问题标题】:Merge two dataframes based on fuzzy-matches in two columns [duplicate]基于两列中的模糊匹配合并两个数据框[重复]
【发布时间】:2019-12-09 23:36:16
【问题描述】:

我有 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 是否匹配,如果匹配,则应合并,如果不匹配,则不应(我怀疑需要内部合并)。如果辅助 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,则基于公司进行类似的匹配。如果没有出现第二个 ID 或公司的匹配项,则不会对该行进行合并。

【问题讨论】:

  • 如果辅助 id 为 0,您是否只将其与辅助 id 为 0 的其他行或任何基于公司名称模糊匹配的行匹配?
  • 为什么在你的最终结果中第一名是10056526008010 和公司g

标签: python pandas merge fuzzy-comparison


【解决方案1】:

让dataframes为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 是一个函数,它接受两个系列并返回一个布尔系列或数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2018-01-30
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多