首页 > 解决方案 > Pandas 系列矢量化文本处理

问题描述

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

       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
   ...

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

标签: pythonregexpandas

解决方案


使用您提供的示例,您可以使用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()您需要的标准

编辑:查看Series.str.replace 的文档后,它等同于re.sub()你可以这样做:

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”。有了这个。


推荐阅读