我想使用矢量化操作来改进我的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
...
是否有可能一次完成整个系列?
答案 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,他给了我一些关于如何继续的直觉。