Python 熊猫系列矢量化文本处理
我想使用矢量化操作改进我的Pandas代码。假设我有一个简单的数据框,其中有一个文本列,可能包含URLPython 熊猫系列矢量化文本处理,python,regex,pandas,Python,Regex,Pandas,我想使用矢量化操作改进我的Pandas代码。假设我有一个简单的数据框,其中有一个文本列,可能包含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/[
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)
是否可以一次对整个系列执行此操作?根据您给出的示例,您可以使用
str.replace()
:
然后,如果它不符合您的所有条件,您可以添加更多所需的.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])
df['column1']=df['column1'].str.replace('https*://[\w\.]+\.com[\w=*/\-]+\124; https*://[\w\.]+\.com[\w\.]+\.com/[\w/\-]+',
lambda x:re.findall(')(?根据您给出的示例,您可以使用str.replace()
:
然后,如果它不符合您的所有条件,您可以添加更多所需的.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])
df['column1']=df['column1'].str.replace('https*://[\w\.]+\.com[\w=*/\-]+\124; https*://[\w\.]+\.com[\w\.]+\.com/[\w/\-]+',
lambda x:re.findall(')(?保留替换的逻辑和代码,您可以按如下方式执行:
import pandas as pd
import re
d = {'Column1': ["hello http://www.google.com", "bye www.mail.com www.docs.google.com/index"]}
df = pd.DataFrame(data=d)
f = lambda 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)
print(df["Column1"].apply(f))
将熊猫作为pd导入
进口稀土
d={'Column1':[“你好http://www.google.com,“再见www.mail.com www.docs.google.com/index”]}
df=pd.DataFrame(数据=d)
f=lambda s:re.sub('https*://[\w\.]+\.com[\w=*/\-]+\124https*://[\w\.]+\.com[\w\.]+\.com/[\w/\-]+',lambda x:re.findall('(?保留替换的逻辑和代码,您可以按如下方式执行:
import pandas as pd
import re
d = {'Column1': ["hello http://www.google.com", "bye www.mail.com www.docs.google.com/index"]}
df = pd.DataFrame(data=d)
f = lambda 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)
print(df["Column1"].apply(f))
将熊猫作为pd导入
进口稀土
d={'Column1':[“你好http://www.google.com,“再见www.mail.com www.docs.google.com/index”]}
df=pd.DataFrame(数据=d)
f=lambda s:re.sub('https*://[\w\.]+\.com[\w=*/\-]+| https*://[\w\.]+\.com[\w\.]+\.com/[\w/\-]+',lambda x:re.findall('(?)?
在这里,我们明确定义了函数(替换URL的开头),然后以矢量化的方式将其应用于数据帧的整个列。此方法通常比pandas replace方法快,尽管我在这里没有计时,所以在这种情况下我无法确定
在这里,我们清楚地定义了函数(替换URL的开头),然后我们以矢量化的方式将其应用于数据帧的整个列。这种方法通常比pandas replace方法快,尽管我没有在这里计时,所以在这种情况下我无法确定。在多次尝试错误后,我找到了一个有效的解决方案。它远没有效率,但目前我需要一些有效的方法,我我们将在不久的将来对其进行优化并更新帖子
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,他给了我一些如何继续的直觉。在多次尝试一个错误后,我找到了一个有效的解决方案。这远不是很有效,但目前我需要一些有效的方法,我将在不久的将来尝试优化它并更新帖子
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,他给了我一些关于如何继续的直觉。那么你只想提取网站名称?预期的输出是什么?我编辑了我的问题,请看上面的内容。你当前是否使用pd.Series.apply
?请显示你当前使用的实际代码。你只想提取网站名称吗?什么t是预期的输出?我编辑了我的问题,请看上面您当前使用的是pd.Series.apply
?请显示您当前使用的实际代码这是为了显示如何按照您的要求将函数应用于数据帧,否则Ben t提出的方法也完全有效这是为了显示如何应用函数正如你所问的,对数据帧进行修改,否则Ben T提出的方法也是完全有效的…很有趣。我会看看这一点,并尝试看看发生了什么事。我很抱歉,虽然你的回答有点有用,但我认为它没有解决我的问题,所以我不会接受它yet@m33n你能告诉我在什么情况下解决不了这个问题吗问题,也许我能帮上忙:)第一种方法是矢量化方法。第二种方法(除了正则表达式模式)也不利于您的预期输出。嗯……很有趣。我会看看这一点,并尝试看看发生了什么。我很抱歉,尽管您的答案有点有用,但我认为它没有解决我的问题,所以我不会接受它yet@m33n你能告诉我吗在它不能解决问题的地方,也许我能帮上忙:)第一种方法是一种矢量化的方法来完成这项工作。第二种方法除了regex模式之外也不适合您的预期输出。Apply方法不是矢量化的。str.replace()确实是矢量化的方法…Apply方法不是矢量化的。str.replace()是确实是矢量化的方法。。。