我想合并两个数据帧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相关问答推荐

Gekko解算器错误results.json未找到,无法找出原因

在后台运行的Python函数

使用Curses for Python保存和恢复终端窗口内容

Pandas 群内滚动总和

无法导入已安装的模块

基本链合同的地址是如何计算的?

从今天起的future 12个月内使用Python迭代

由于瓶颈,Python代码执行太慢-寻求性能优化

遵循轮廓中对象方向的计算线

在上下文管理器中更改异常类型

如何从FDaGrid实例中删除某些函数?

如何在BeautifulSoup中链接Find()方法并处理无?

pandas DataFrame GroupBy.diff函数的意外输出

标题:如何在Python中使用嵌套饼图可视化分层数据?

如何在solve()之后获得症状上的等式的值

给定高度约束的旋转角解析求解

使用Python查找、替换和调整PDF中的图像'

基于形状而非距离的两个numpy数组相似性

Python避免mypy在相互引用中从另一个类重定义类时失败

如何在海上配对图中使某些标记周围的黑色边框