如何在另一个 df 中搜索一个 df 的子字符串?

How to search a substring from one df in another df?

我已阅读 并想做类似的事情。

我有2个dfs:

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 中的 addres_line 和城市匹配,并包括匹配来自哪个 file_num。

我的理想输出是:

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

基于上面链接的 post,我做了一个前瞻性正则表达式,并且正在使用 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中的地址是手动输入的,所以有时会乱码。

因为顺序不对,我用的是regex的look ahead方法

前瞻方法导致 str.extract 不输出任何值。虽然我仍然可以过滤掉空值,但它只会保留正确的匹配项。

我的主要问题是我无法重新加入 df1 以获得 file_num。

我可以用 for 循环并迭代每条记录来搜索这道题,但它需要太长时间。 df1实际上有5000条左右的记录,而df2有几百万条,所以需要2个多小时才能运行。有没有办法利用矢量化来解决这个问题?

谢谢!

首先创建一个新系列,它是 df2 中的每个“地址”对应于 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)
index file_num City address_line DB_num Address
0 1.0 Toronto 123 Fake St AB1 Toronto 123 Fake St