我正在尝试提取顶级网址并忽略路径。我使用下面的代码:
for row in Mexico['Page URL']:
parsed_uri = urlparse( 'http://www.one.com.mx/furl/Conteúdo Raiz/Meu' )
Mexico['SubDomain'] = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
此脚本已在过去一小时内运行。当我运行它时,它发出以下警告:
/anaconda/lib/python3.6/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
This is separate from the ipykernel package so we can avoid doing imports until
如果有人能以更快的方式提出建议,我会很感激,也许指出“警告”暗示的方法
答案 0 :(得分:3)
如果Series很长,那么为Series的每一行调用一次Python函数可能会非常慢。加快这一点的关键是用(理想情况下)一个向量化函数调用替换多个函数调用。
使用Pandas时,这意味着用vectorized string functions重写Python函数(例如urlparse
)。
由于urlparse
是fairly complicated函数,重写urlparse
会非常困难。但是,在您的情况下,我们的优势在于知道我们关注的所有网址都以https://
或http://
开头。因此,我们不需要urlparse
的全面普遍性。我们也许可以使用更简单的规则: netloc是跟随https://
或http://
的任何字符,直到字符串结尾或下一个/
,以先到者为准< / em>的。
如果是这样,那么
Mexico['Page URL'].str.extract('(https?://[^/]+)', expand=False)
可以从整个Series Mexico['Page URL']
中提取所有netloc,而无需循环且没有多个urlparse
函数调用。当len(Mexico)
很大时,这会快得多。
例如,
import pandas as pd
Mexico = pd.DataFrame({'Page URL':['http://www.one.com.mx/furl/Conteúdo Raiz/Meu',
'https://www.one.com.mx/furl/Conteúdo Raiz/Meu']})
Mexico['SubDomain'] = Mexico['Page URL'].str.extract('(https?://[^/]+)', expand=False)
print(Mexico)
产量
Page URL SubDomain
0 http://www.one.com.mx/furl/Conteúdo Raiz/Meu http://www.one.com.mx
1 https://www.one.com.mx/furl/Conteúdo Raiz/Meu https://www.one.com.mx