首页 > 解决方案 > 将一列df中的字符串值检查到具有多个条件的另一列df

问题描述

我有两个数据框:

import pandas as pd

first_df = pd.DataFrame({'Full Name': ['Mulligan Nick & Mary', 'Tsang S C', 'Hattie J A C '],
                         'Address': ['270 Claude Road', '13 Sunnyridge Place', '18A Empire Road']})

second_df = pd.DataFrame({'Owner' : ['David James Mulligan', 'Brenda Joy Mulligan ', 'Helen Kwok Hattie'],
                          'Add Match': ['19 Dexter Avenue', 'Claude Road ', 'Building NO 512']})

无论如何,仅将列中的第一个字符串与Full Name列中的最后一个字符串匹配Owner

如果有匹配,然后我想比较Address看看Add match是否有任何相似的值。如果第一个条件通过但第二个条件失败,则不会将其添加到新数据框中。

使用左连接会导致:

new_df = first_df.merge(second_df, how='left', left_on = ['Full Name', 'Address'], right_on = ['Owner', 'Add Match'])
print(new_df.head())

              Full Name              Address Owner Add Match
0  Mulligan Nick & Mary      270 Claude Road   NaN       NaN
1             Tsang S C  13 Sunnyridge Place   NaN       NaN
2         Hattie J A C       18A Empire Road   NaN       NaN

然而,想要的输出看起来更像这样:

new_df

Name                 Address
----                 --------
Brenda Joy Mulligan  Claude Road

标签: pythonpandasdataframe

解决方案


您可以利用difflibPython 标准库中的模块来查找不同列之间的相似之处。例如,您可以定义以下函数:

from difflib import SequenceMatcher

def compare_df(left, right, col: str):
    left[f"{col}_match_ratio"] = 0

    for value in left[col]:
        best_ratio = 0
        for other in right[col]:
            result = SequenceMatcher(None, str(value), str(other)).ratio()
            if result > best_ratio:
                best_ratio = result
        left.loc[left[col] == value, f"{col}_match_ratio"] = round(best_ratio, 2)

然后:

  • 您只需确保要比较的列在两个 dfs 中具有相同的名称
  • 您调用 df_compare(first_df, second_df, "Owner") 将“Owner_match_ratio”列添加到 second_df
  • 最后,您按照所需的最小匹配率(例如 70 %)过滤第二个 df,如下所示:new_df = second_df.loc[second_df["Owner_match_ratio"] > 0.7, :]

推荐阅读