我正在尝试提取顶级URL并忽略路径。我正在使用以下代码:

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


如果有人能以更快的方式提出建议,我将不胜感激,也许有人指出了“警告”所建议的方法

最佳答案

如果Series很长,那么为Series的每一行调用一次Python函数可能会很慢。加快速度的关键是将多个函数调用替换为(理想情况下)一个向量化函数调用。

使用Pandas时,这意味着要用vectorized string functions重写Python函数(例如urlparse)。

由于urlparsefairly complicated函数,因此重写urlparse会非常困难。但是,对于您而言,我们的优势是知道我们关心的所有URL均以https://http://开头。因此,我们完全不需要通用的urlparse。我们也许可以用一条更简单的规则来处理:netloc是字符https://http://后面的任何字符,直到字符串的末尾或下一个/,以先到者为准。
如果是这样的话

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

关于python - Pandas 功能花费的时间太长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44883022/

10-12 16:51