如何在另一个 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,我做了一个前瞻性正则表达式,并且正在使用 insert
和 str.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
我已阅读
我有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,我做了一个前瞻性正则表达式,并且正在使用 insert
和 str.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 |