2017-07-03 250 views
1

我试图提取顶级网址并忽略路径。我使用下面的代码:熊猫功能花费时间太长

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

一开始移动'urlparse'外循环调用。它每次都做同样的事情。你甚至不会在你的循环中使用'row',那么为什么有循环?你输错了你的代码吗? –

+0

感谢您的协助。数据帧的URL不同。如果我将这一点从循环中移出,我将如何为此进行调整? –

+0

这可能是我isse的一部分。我试图循环遍历数据框并复制域/子域,忽略路径 –

回答

3

一次调用Python函数如果系列非常长,系列的每一行可能会非常缓慢。加速这个过程的关键是用(理想情况下)一个矢量化函数调用来代替多个函数调用。

当使用熊猫时,这意味着根据vectorized string functions重写Python函数(例如urlparse)。

既然urlparsefairly complicated功能,重写urlparse会很难。不过,就您的情况而言,我们有优势,即知道我们关心的所有网址都以https://http://开头。所以我们不需要urlparse的全面通用性。我们也许可以用一个更简单的规则来做:netloc是跟随https://http://的任何字符,直到字符串结尾或下一个/,以先到者为准。 如果这是真的,那么

Mexico['Page URL'].str.extract('(https?://[^/]+)', expand=False) 

可以提取所有从整个系列Mexico['Page URL']的netlocs没有循环,没有多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 
+0

我可以添加条件以同时查找http和https吗? –

+0

当然。在这种情况下,[regex](https://docs.python.org/3/library/re.html)将是'https?:// [^ /] +'。我修改了上面的代码以显示我的意思。 – unutbu

相关问题