合并 pandas 中列名不同且长度不同的两个数据框

Posted

技术标签:

【中文标题】合并 pandas 中列名不同且长度不同的两个数据框【英文标题】:Merging two data frames in pandas that don't have the same column names and are different lengths 【发布时间】:2021-11-30 03:05:15 【问题描述】:

我有两个要合并的数据框,问题是它们的长度不同并且没有重叠的列。我基本上想将网站与公司名称匹配,所以它们都排成一排。有些公司没有网站,所以我希望这些行只填充 Naan。

我所拥有的示例:

Company other info 1
name1 balkdksj
name 2 and so on
Website other info 2
http://www. some form of company name1 .com bljadksjd

是否有合并它们的方法?公司名称并不总是与网址中包含的相同(我尝试去除公司名称的空格并在网址中搜索,但它们通常不会以这种方式对齐)。你能搜索一个特定的词吗?

我希望表格看起来像:

Company other info 1 Website other info 2
name1 njfhrif name1 website fjvbfjvb
name2 bfjbfj Naan Naan

【问题讨论】:

【参考方案1】:

您可以从df1 中获取Company 名称列表,然后使用它创建一个正则表达式模式,以便从df2Website 列中提取。使用pd.merge()左连接得到结果,如下:

(假设df1 / df2 是您的第一个和第二个数据帧的名称)

pat = '|'.join(df1['Company'].values)

df_result = pd.merge(df1, df2, 
                     left_on='Company',
                     right_on=df2['Website'].str.extract(rf'(pat)')[0],
                     how='left')

如果您想将Company 名称与Website 中的子字符串进行匹配,仅全词匹配,您可以定义模式pat,如下所示:

pat = r'\b' + '|'.join(df1['Company'].values) + r'\b'

结果:

print(df_result)

  Company other info 1                                      Website other info 2
0   name1     balkdksj  http://www. some form of company name1 .com    bljadksjd
1  name 2    and so on                                          NaN          NaN

说明:

我们生成正则表达式模式pat,如下:

print(pat)

'name1|name 2'

这个正则表达式模式被输入str.extract() 以从列Website 中提取列中任何匹配的公司名称。然后我们在合并过程中使用它来匹配来自df1Company 名称。

【讨论】:

您好,感谢您的帮助!这似乎只匹配一个网站:/我认为问题是网站中不包含完整的公司名称,例如公司名称可能是:Adrian Lee & Partners,网站名称是:aleepartners.com。你知道正则表达式中是否有办法找到最常见的单词?喜欢说任何相同的词都会匹配 @IsabelJones 在这种情况下,很难通过合并来完成,因为没有可匹配的通用文本。可能,您必须重新设计第二个数据帧的数据结构以包括公司名称或某种公司代码(如果是公司代码,您还需要在第一个数据帧中添加公司代码)。由于 URL 可能与原始名称完全不同,因此您当前的数据结构根本无法轻松做到这一点。

以上是关于合并 pandas 中列名不同且长度不同的两个数据框的主要内容,如果未能解决你的问题,请参考以下文章

合并两个具有相同列名但在熊猫中列数不同的数据框

Pandas 合并具有不同列的两个数据框

合并两个不同长度的python pandas数据帧,但将所有行保留在输出数据帧中

熊猫合并:合并同一列上的两个数据框,但保留不同的列

Python Pandas - 具有不同列的 Concat 数据框忽略列名

如何合并/连接两个不同长度的熊猫数据框?