【问题标题】:How to match a regex pattern between two columns in pandas dataframe efficiently?如何有效地匹配熊猫数据框中两列之间的正则表达式模式?
【发布时间】: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


【解决方案1】:

确保您的 url cols 是 dtype str

尝试使用 8 位 id 为每个列创建新列:

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

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多