熊猫系列矢量化文本处理

时间:2018-05-28 14:25:10

标签: python regex pandas

我想使用矢量化操作来改进我的Pandas代码。因此,我们假设我有一个简单的DataFrame,其中包含一个可能包含网址的文本列。

       Column1
0  hello http://www.google.com
1  bye www.mail.com www.docs.google.com/index
   ...

此时我正在迭代行并应用以下替换:

s = re.sub('https*://[\w\.]+\.com[\w=*/\-]+|https*://[\w\.]+\.com|[\w\.]+\.com/[\w/\-]+',lambda x: re.findall('(?<=\://)[\w\.]+\.com|[\w\.]+\.com', x.group())[0], s)

预期输出应为:

       Column1
0  hello google.com
1  bye mail.com docs.google.com
   ...

是否有可能一次完成整个系列?

4 个答案:

答案 0 :(得分:2)

如果您提供的示例,您可以使用str.replace()

df['column1'] = df['column1'].str.replace('http|https|://|www.','') \ 
                              #replace some patterm by nothing
                              .str.replace('.com/[\w/\-]+','.com') 
                              # replace specific pattern by other specific pattern

如果它不符合您的所有条件,您可以添加更多.str.replace()与您需要的标准

编辑:查看与re.sub()相当的documentation of Series.str.replace后,您可以这样做:

df['column1'] = df['column1'].str.replace('https*://[\w\.]+\.com[\w=*/\-]+|https*://[\w\.]+\.com|[\w\.]+\.com/[\w/\-]+',
                                          lambda x: re.findall('(?<=\://)[\w\.]+\.com|[\w\.]+\.com', x.group())[0])

在内部,参数与您问题的re.sub()中的参数相同。但是你没有真正得到你期望的输出,你保留了www。&#39;有这个。

答案 1 :(得分:1)

保留您的逻辑和代码以进行替换,您可以按照以下步骤进行操作:

PodioFile::get_raw( $file_id );

答案 2 :(得分:1)

import re

def replace_url(text):
    """
    Define the beginning of a url in a regex and replace any input text with an empty string using the regex
    INPUT: text (type = string)
    OUTPUT: text (type = string)
    """
    url_reg = re.compile(r"(http(s)?|www).*(\.)")
    return re.sub(url_reg, "", text)

df['Column1'] = df['Column1'].apply(replace_url)

在这里,我们有明确定义的函数(替换urls的开头),然后我们以矢量化的方式将它应用于数据帧的整个列。这种方法通常比pandas替换方法更快,虽然我没有在这里定时,所以在这种情况下我无法确定。

答案 3 :(得分:0)

经过多次尝试错误后,我找到了有效的解决方案。它远没有效率,但此时我需要一些有用的东西,我会尽力在不久的将来优化它并更新帖子。

def replace_url(text):
    pat = '(([https?://]*[www\.]*)([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?)'
    urls = re.findall(pat, text)

    for url in urls:
        text = text.replace(url[0], url[2])

    return text

df['Column1'] = df['Column1'].apply(replace_url)

感谢@ killerT2333,他给了我一些关于如何继续的直觉。