Python-比较姓氏列并在每行中获得最大相似度

时间:2018-11-06 09:30:02

标签: python

我有一对成对的桌子。目的是比较姓氏。但是,其中一些具有双桶姓氏,该姓氏已分为两列。我想在这些姓氏之间进行所有可能的比较,并获得它们的最大相似度。

例如: 我有这张桌子

+-----------+-----------+------------+-----------+-----------+------------+
|person1_id |lastname1_1|lastname1_2 |person2_id |lastname2_1|lastname2_2 |
+-----------+-----------+------------+-----------+-----------+------------+
|1          |Johnson    |null        |6          |Johnson    |null        |
|2          |Smith      |Dorrien     |7          |Smith      |null        |
|3          |Scott      |null        |8          |Garcia     |Scott       |
|4          |Morris     |null        |9          |Flores     |null        |
|5          |Foster     |null        |10         |Nelson     |null        |
+-----------+-----------+------------+-----------+-----------+------------+

更好的结果是:

+-----------+-----------+------------+-----------+-----------+------------+----------+
|person1_id |lastname1_1|lastname1_2 |person2_id |lastname2_1|lastname2_2 |similarity|
+-----------+-----------+------------+-----------+-----------+------------+----------+
|1          |Johnson    |null        |6          |Johnson    |null        |1.0       |
|2          |Smith      |Dorrien     |7          |Smith      |null        |1.0       |
|3          |Scott      |null        |8          |Garcia     |Scott       |1.0       |
|4          |Morris     |null        |9          |Flores     |null        |0.5       |
|5          |Foster     |null        |10         |Nelson     |null        |0.16      |
+-----------+-----------+------------+-----------+-----------+------------+----------+

有什么办法可以实现这一目标?

谢谢。

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题。首先,只是重新创建数据,以便可以查看我正在测试的内容。

import pandas as pd

person_one_first_surname_column = ["Johnson", "Smith", "Scott", "Morris", "Foster"]
person_two_first_surname_column = ["Johnson", "Smith", "Garcia", "Flores", "Nelson"]
person_one_second_surname_column = ["null", "Dorrien", "null", "null", "null"] 
person_two_second_surname_column = ["null", "null", "Scott", "null", "null"]



dataset = {'lastname1_1': person_one_first_surname_column, 'lastname1_2': person_one_second_surname_column, "lastname2_1" : person_two_first_surname_column, "lastname2_2": person_two_second_surname_column}
df = pd.DataFrame(data=dataset)

将来,如果您以代码格式包含示例数据,将有助于您节省时间!我不确定您如何处理“空”值,因此假设它们也是一个字符串。

我们首先定义一个比较两个名称列表的函数。它的工作原理是创建一个新的(a,b)对列表,其中a来自第一个列表,b来自第二个列表,并且仅当它们不等于{{1}时才包括它们}。然后,在它们上运行序列匹配器并获取比率,然后从该列表中获取最大值。

"null"

我们现在使用apply函数在数据帧的每一行上调用新函数,将名称列表作为变量输入。我们将此新数据分配给数据框,作为新行“ Max_similarity”。

import difflib
def get_max_similarity(list_of_user_one_names, list_of_user_two_names):
    max_similarity = max([difflib.SequenceMatcher(None, a,b).ratio() for a in list_of_user_one_names if a != "null" for b in list_of_user_two_names if b != "null"])
    return max_similarity

输出:

df["Max_similarity"] = df.apply(lambda row: get_max_similarity([row["lastname1_1"], row["lastname1_2"]], [row["lastname2_1"], row["lastname2_2"]]), axis=1)