我的问题是如何有效地使用正则表达式模式来查找从excel文件中提取的两个pandas df之间的匹配
首先,感谢您抽出时间来研究我的问题。我是python的新手,在使用它处理大型数据集时更是如此。我知道我应该使用堆栈作为最后的手段。
现在我正在靠墙撞击一些可能很简单的东西。
问题: 我有两个excel文件:
一个只有1列* 300行=原始网址
另一个可能非常大,从20k和更多翻译的网址
目的: 我有原始网址,我必须找到他们在大excel文件中的翻译版本。
两个网址之间唯一的共同点是网址中某处的8位数字
我考虑过合并,但它不会起作用,因为它是部分匹配(据我所知)。 我找到了一个可能有趣的解决方案:.where这可以让我完全按照自己的意愿行事。但是我收到了这个错误:
master_list ["已翻译"] = crawlfr.url.where(number_search.search(master_list).group(0)== number_search.search(crawl_fr).group(0),master_list.url) TypeError:期望的字符串或缓冲区
正如我理解这个错误一样,问题可能来自正则表达式,它似乎除了字符串之外别无其他。
事实上,当我通过在函数中提取匹配对象来比较两个字符串时,它可以工作。
def skl_finder(master_list,crawl_fr):
skl_search=re.compile("\d{8}")
if skl_search.search(master_list).group(0) ==
skl_search.search(crawl_fr).group(0):
return skl_search.search(master_list).group(0)
我认为这个问题与我想做的事情非常接近,但没有任何回复:Pandas: Comparing two dataframes with identical data structure but differences in data using pattern matching
import regex as re
import pandas as pd
crawl_loc="translated_file_set.xlsx"
master_list_loc="original_fileset.xlsx"
crawlfr=pd.read_excel(crawl_loc,parse_cols="E")
master_list=pd.read_excel(master_list_loc)
number_search=re.compile("\d{8}")
master_list["translated"] =
crawlfr.url.where(number_search.search(master_list).group(0) ==
number_search.search(crawl_fr).group(0), master_list.url)
master_list.to_excel("result_file.xlsx")
答案 0 :(得分:0)
确保您的网址列为d str
。
尝试为每个col创建一个8位数字的新cols:
crawlfr['url_id'] = crawlfr.url.str.extract("\d{8}")
master_list['url_id'] = master_list.url.str.extract("\d{8}")
join
上的url_id
:
crawlfr.join(master_list, on='url_id')