将URL参数提取到Pandas DataFrame中

时间:2015-10-22 18:45:02

标签: python pandas urlparse

列表中包含带参数的网址:

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

每个网址可能包含4个参数中的任何一个。

我想提取网址参数并将其添加到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中。也许还有更好的方法吗?原始文件是大约1米的URL。

3 个答案:

答案 0 :(得分:4)

我将推荐一个urlparse库,这种方法的好处是您不需要事先知道查询的字段名称('param1'等):< / p>

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

答案 1 :(得分: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

答案 2 :(得分:1)

或者,由于pandas为0.18。0(2016年3月13日),您可以使用pandas.Series.str.extractall()方法:

params = df.url.str.extractall('[?&](?P<parameter>[^?#=]+)=?(?P<value>[^&]*)')
print params
Out[1]:
        parameter   value
  match                  
0 0        param1   apple
  1        param2  tomato
  2        param3  carrot
1 0        param1  banana
  1        param3  potato
  2        param4   berry
2 0        param2   apple
  1        param3  tomato
  2        param4  carrot

或者从中改编的东西。

能够(更好地)访问urlparse库中使用的正则表达式,以便能够在此方法和pandas.Series.str.extract()中直接使用它们,这将是很好的。

最后,请务必为Working with Text Data添加书签,它有很多有用的示例。