2017-07-03 19 views
1

トップレベルの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) 

このスクリプトは過去1時間実行されています。誰もが、おそらく方法「警告」にポインタが

+0

ループ外 'urlparse'コールを移動します。それは毎回同じことをします。ループで 'row'を使用してもいけません。だから、ループはなぜですか?あなたのコードを間違って入力しましたか? –

+0

ありがとうございました。 URLはデータフレームごとに異なります。私がこれをループから外してしまえば、どうすればこれに合うだろうか? –

+0

これはおそらく私のisseの一部です。私はデータフレームをループし、ドメイン/サブドメインをコピーしてパスを無視しようとしています –

答えて

3

示唆一度Pythonの関数を呼び出すと、迅速な方法について助言することができれば

/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 

が、私はそれを感謝:私はそれを実行したときには、次の警告を与えましたシリーズが非常に長い場合、シリーズの各行は非常に遅くなる可能性があります。これを高速化するための鍵は、複数の関数呼び出しを(理想的には)1つのベクトル関数呼び出しに置き換えることです。

パンダを使用する場合は、vectorized string functionsという意味でのPython関数(例:urlparse)の書き換えを意味します。

urlparsefairly complicatedなので、urlparseの書き換えはかなり難しいでしょう。しかし、あなたのケースでは、我々が気にするすべてのURLがhttps://またはhttp://で始まることを知っているという利点があります。だから我々は本格的に普及しているurlparseを必要としない。 netlocは、文字列の末尾までhttps://またはhttp://のいずれかの文字の後にあるか、または/のいずれか早いほうになるまでのいずれかになります。 それが本当であれば、

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

がループせずに、複数のurlparse関数呼び出しをせずに全体のシリーズMexico['Page URL']からすべてのnetlocsを抽出することができます。 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の両方をキャッチするcondtionを追加できますか? –

+0

その場合、[regex](https://docs.python.org/3/library/re.html)は 'https?:// [^ /] +'になります。私は上記のコードを変更して、私が意味することを示しました。 – unutbu

関連する問題