我想合并两个数据帧df1和df2,以便比较两个值INFO 1和INFO 2.合并它们的键隐藏在名称列中.DF1是"干净的",因为它有一个名字列和一个姓氏列.然而,DF2是一个棘手的问题.只有一个名称列,可以用不同的方式给出名称.标准大小写是名字和姓氏,但如下图所示,它可以包含两个名字,用‘and’或‘&’分隔,甚至可以是完全不同的名字,比如一所学校.

enter image description here

以下是代码中的虚拟数据:

data1 = [['Anna','Tessmann',10], ['Ben','Fachmann',20], ['John','Smith',10]]
df1 = pd.DataFrame(data1, columns=['FirstName','LastName','Info1'])


data2 = [['Ben Fachmann',30], ['School AAA',40], ['John and Melissa Smith',50], ['Bob & Anna Tessmann',20]]
df2= pd.DataFrame(data2, columns=['Name','Info2'])

有谁知道将这两者结合起来的有效方法吗?是否有可能在st上合并‘df2.名称包含df1.Lastname’?或者我正在try 解析df2.Name,我发现nameparser导入HumanName,但我认为它不能处理‘and’和‘&’.

如果有什么不清楚的地方,我很抱歉.非常感谢您提前给予我们的帮助!

推荐答案

您可以使用双精度子字符串merge:

import re

pattern1 = '|'.join(map(re.escape, df1['FirstName']))
pattern2 = '|'.join(map(re.escape, df1['LastName']))

match1 = df2['Name'].str.extractall(f'(?P<FirstName>{pattern1})').droplevel(1)
match2 = df2['Name'].str.extractall(f'(?P<LastName>{pattern2})').droplevel(1)

out = df1.merge(df2.join(match1).join(match2),
                on=['FirstName', 'LastName'])

输出:

  FirstName  LastName  Info1                    Name  Info2
0      Anna  Tessmann     10     Bob & Anna Tessmann     20
1       Ben  Fachmann     20            Ben Fachmann     30
2      John     Smith     10  John and Melissa Smith     50

Python相关问答推荐

判断两极中N(N 2)列水平是否相等

使用decorator 自动继承父类

如何才能将每个组比上一组增加N %?

单击Python中的复选框后抓取数据

如何使用bs 4从元素中提取文本

计算相同形状的两个张量的SSE损失

如何使用symy打印方程?

如何在Windows上用Python提取名称中带有逗号的文件?

按列分区,按另一列排序

用Python解密Java加密文件

如何使用数组的最小条目拆分数组

Python虚拟环境的轻量级使用

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

未知依赖项pin—1阻止conda安装""

如何保持服务器发送的事件连接活动?

如何指定列数据类型

Python Pandas获取层次路径直到顶层管理

如何使用OpenGL使球体遵循Python中的八样路径?

从源代码显示不同的输出(机器学习)(Python)

如何将一组组合框重置回无 Select tkinter?