如何有效地匹配pandas数据帧中两列之间的正则表达式模式?

时间:2017-09-15 08:54:10

标签: python pandas dataframe series

我的问题是如何有效地使用正则表达式模式来查找从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")

1 个答案:

答案 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')