1

パラメータ付きの URL アドレスを含むリストがあります。

http://example.com/?param1=apple&param2=tomato&param3=carrot
http://sample.com/?param1=banana&param3=potato&param4=berry
http://example.org/?param2=apple&param3=tomato&param4=carrot

各 URL には、4 つのパラメーターのいずれかを含めることができます。

URL パラメータを抽出して Pandas DataFrame に追加したいと考えています。DataFrame には、URL 列とパラメーターを含む 4 つの列が必要です。URL にパラメーターが存在しない場合、セルは空です。

URL    param1    param2     param3    param4
...    apple     tomato     carrot
...    banana               potato    berry
...              apple      tomato    carrot

パラメータを簡単に抽出できるpython組み込みのurlparseモジュールを使用することを計画していました。

import urlparse
url = 'http://example.com/?param1=apple&param2=tomato&param3=carrot'
par = urlparse.parse_qs(urlparse.urlparse(url).query)
print par['param1'], par['param2']

Out: ['apple'] ['tomato']

urlparseを使用すると、URL のパラメーターのリストを取得できます。

import pandas as pd

urls = ['http://example.com/?param1=apple&param2=tomato&param3=carrot',
        'http://sample.com/?param1=banana&param3=potato&param4=berry',
        'http://example.org/?param2=apple&param3=tomato&param4=carrot']

df = pd.DataFrame(urls, columns=['url'])
params = [urlparse.parse_qs(urlparse.urlparse(url).query) for url in urls]
print params

Out: [{'param1': ['apple'], 'param2': ['tomato'], 'param3': ['carrot']},
      {'param1': ['banana'], 'param3': ['potato'], 'param4': ['berry']},
      {'param2': ['apple'], 'param3': ['tomato'], 'param4': ['carrot']}]
...

抽出されたパラメーターを DataFrame に追加する方法がわかりません。多分それを行うより良い方法がありますか?元のファイルは ~1m の URL です。

4

3 に答える 3

4

私がお勧めするurlparseライブラリがあります。このアプローチの利点は、クエリのフィールド名を事前に知る必要がないことです ('param1'など)。

In [278]:

import urlparse
In [279]:

T = ['http://example.com/?param1=apple&param2=tomato&param3=carrot',
     'http://sample.com/?param1=banana&param3=potato&param4=berry',
     'http://example.org/?param2=apple&param3=tomato&param4=carrot']
In [280]:

df = pd.concat(map(lambda x: pd.DataFrame(urlparse.parse_qs(urlparse.urlparse(x).query)), T))
print df
#df['URL'] = T : add another column with the original URL's
   param1  param2  param3  param4
0   apple  tomato  carrot     NaN
0  banana     NaN  potato   berry
0     NaN   apple  tomato  carrot
于 2015-10-22T19:00:33.813 に答える
3

または、pandas 0.18.0 (2016 年 3 月 13 日) 以降、このpandas.Series.str.extractall()メソッドを次のように使用できます。

params = df.url.str.extractall('[?&](?P<parameter>[^?#=]+)=?(?P<value>[^&]*)')
print params
アウト[1]:
        パラメータ値
  マッチ                  
0 0 param1 りんご
  1 param2 トマト
  2 param3 ニンジン
1 0 param1 バナナ
  param3ポテト 1個
  2 param4 ベリー
2 0 param2 りんご
  1 param3 トマト
  2 param4 ニンジン

またはそれから適応したもの。

pandas.Series.str.extract()このメソッドで直接使用できるように、urlparse ライブラリで使用される正規表現に (より適切に) アクセスできると便利です。

最後に、必ずWorking with Text Dataをブックマークしてください。役に立つ例がたくさんあります。

于 2016-11-28T02:07:11.370 に答える
1

辞書内包表記を使用して、パラメーターごとにパラメーター内のデータを抽出できます。リスト形式の最終値が必要かどうかはわかりません。そうでない場合は、簡単に抽出できます。

>>> pd.DataFrame({p: [d.get(p) for d in params] 
                  for p in ['param1', 'param2', 'param3', 'param4']})
     param1    param2    param3    param4
0   [apple]  [tomato]  [carrot]      None
1  [banana]      None  [potato]   [berry]
2      None   [apple]  [tomato]  [carrot]

また...

>>> pd.DataFrame({p: [d[p][0] if p in d else None for d in params] 
                  for p in ['param1', 'param2', 'param3', 'param4']})
   param1  param2  param3  param4
0   apple  tomato  carrot    None
1  banana    None  potato   berry
2    None   apple  tomato  carrot
于 2015-10-22T18:59:08.293 に答える