如何从一个数据框中搜索子字符串在另一个数据框中的位置?

3

我阅读了 此帖子,想要做类似的事情。

我有两个数据框:

df1:

file_num city address_line
1 Toronto 123 Fake St
2 Montreal 456 Sample Ave

df2:

DB_Num Address
AB1 Toronto 123 Fake St
AB3 789 Random Drive, Toronto

我想知道 df2 中哪些 DB_Num 匹配到了 df1 中的 address_line 和 city,并包含匹配文件号(file_num)。

我的理想输出是:

file_num city address_line DB_Num Address
1 Toronto 123 Fake St AB1 Toronto 123 Fake St

基于上面链接的帖子,我使用了前瞻正则表达式,并使用了 insertstr.extract 方法进行搜索。

df1['search_field'] = "(?=.*" + df1['city'] + ")(?=.*" + df1['address_line'] + ")"
pat = "|".join(df1['search_field'])
df = df2.insert(0, 'search_field', df2['Address'].str.extract("(" + pat + ')', expand=False))

由于我的df2地址是手动输入的,有时会出现顺序错乱的情况。

因为出现了这种情况,所以我正在使用正则表达式的先行查找方法。

这种先行查找方法导致str.extract没有输出任何值。尽管我仍然可以过滤掉空值并保留正确的匹配项。

我的主要问题是没有办法将结果与df1连接起来以获取文件号。

我可以通过for循环来解决这个问题,并迭代每条记录进行搜索,但这需要太长时间了。实际上,df1约有5000条记录,而df2有数百万条记录,因此需要运行超过2小时。有没有一种利用向量化的方法来解决这个问题呢?

谢谢!


我认为你无法对操作进行向量化,但可以使用multiprocessnumbaDask。我认为你应该使用模糊逻辑来合并你的两个数据框。 - Corralien
1个回答

2

首先创建一个新系列,该系列是df2中每个“Address”对应于df1中的“address_line”的行,如果存在这样的行:

r = '({})'.format('|'.join(df1.address_line))
merge_df = df2.Address.str.extract(r, expand=False)
merge_df

#输出:

0    123 Fake St
1            NaN
Name: Address, dtype: object

现在我们将df1与“address_line”列和df2的“merge_df”系列合并:
df1.merge(df2, left_on='address_line', right_on=merge_df)
索引 文件编号 城市 地址行 数据库编号 地址
0 1.0 多伦多 123 假街道 AB1 多伦多 123 假街道

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接