我有一对成对的桌子。目的是比较姓氏。但是,其中一些具有双桶姓氏,该姓氏已分为两列。我想在这些姓氏之间进行所有可能的比较,并获得它们的最大相似度。
例如: 我有这张桌子
+-----------+-----------+------------+-----------+-----------+------------+
|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 |
+-----------+-----------+------------+-----------+-----------+------------+----------+
有什么办法可以实现这一目标?
谢谢。
答案 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)