2017-09-15 15 views
0

我的问题是有效地使用正则表达式模式来查找两个熊猫之间的匹配,从excel文件中提取df如何有效地匹配pandas数据框中两列之间的正则表达式模式?

首先,感谢您花时间看看我的问题。我对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

不清楚您的问题是什么,速度是多少?国际海事组织可以预先计算搜索关键字,即提取文件中的数字并将其转换为整数作为新列,然后搜索它们。 – georgexsh

+0

速度和如何应用两列之间的正则表达式。如上所述,我有正则表达式的错误,在这种情况下我无法找到工作解决方案来使用两列之间的匹配模式。 –

+0

将excel转换为字符串列表,计算它们上的搜索关键字,将更容易与您不熟悉的pandas IMO进行比较。 – georgexsh

回答

0

请确保网址的cols是D型str

尝试使用8位数的ID为每个创建新的cols:

crawlfr['url_id'] = crawlfr.url.str.extract("\d{8}") 
master_list['url_id'] = master_list.url.str.extract("\d{8}") 

然后joinurl_id

crawlfr.join(master_list, on='url_id')