2017-07-03 289 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