【发布时间】:2017-09-15 23:44:20
【问题描述】:
我的问题是关于有效地使用正则表达式模式来查找从 excel 文件中提取的两个 pandas df 之间的匹配项
首先,感谢您花时间查看我的问题。我对 python 很陌生,在使用它处理大型数据集时更是如此。我知道我应该使用堆栈作为最后的手段。
现在我正在为一些可能很简单的事情撞墙。
问题: 我有两个 excel 文件:
一个只有 1 列 * 300 行 = 原始网址
另一个可能非常大,从 20k 和更多翻译的 url 开始
目的: 我有原始 url,我必须在大 excel 文件中找到它们的翻译对应物。
两个网址之间的唯一共同点是网址中某处的一个 8 位数字
我曾考虑过合并,但它不会起作用,因为它是部分匹配(据我所知)。 我找到了一个可能很有趣的解决方案:.where,它可以让我做我想做的事。但是我收到此错误:
master_list["translated"] = 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")
【问题讨论】:
-
不清楚你的问题是什么,速度? IMO您可以预先计算搜索键,即提取文件中的数字并转换为整数作为新列,然后搜索它们。
-
速度以及如何在两列之间应用正则表达式。如前所述,我的正则表达式有错误,在这种情况下,我找不到在两列之间使用匹配模式的有效解决方案。
-
将excel转入字符串列表,计算搜索键,与你不熟悉的pandas IMO相比更容易。
标签: python pandas dataframe series