我阅读了 此帖子,想要做类似的事情。
我有两个数据框:
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 |
基于上面链接的帖子,我使用了前瞻正则表达式,并使用了 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地址是手动输入的,有时会出现顺序错乱的情况。
因为出现了这种情况,所以我正在使用正则表达式的先行查找方法。
这种先行查找方法导致str.extract
没有输出任何值。尽管我仍然可以过滤掉空值并保留正确的匹配项。
我的主要问题是没有办法将结果与df1连接起来以获取文件号。
我可以通过for循环来解决这个问题,并迭代每条记录进行搜索,但这需要太长时间了。实际上,df1约有5000条记录,而df2有数百万条记录,因此需要运行超过2小时。有没有一种利用向量化的方法来解决这个问题呢?
谢谢!
multiprocess
、numba
或Dask
。我认为你应该使用模糊逻辑来合并你的两个数据框。 - Corralien