列表中包含带参数的网址:
http://example.com/?param1=apple¶m2=tomato¶m3=carrot
http://sample.com/?param1=banana¶m3=potato¶m4=berry
http://example.org/?param2=apple¶m3=tomato¶m4=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¶m2=tomato¶m3=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¶m2=tomato¶m3=carrot',
'http://sample.com/?param1=banana¶m3=potato¶m4=berry',
'http://example.org/?param2=apple¶m3=tomato¶m4=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。
答案 0 :(得分:4)
我将推荐一个urlparse
库,这种方法的好处是您不需要事先知道查询的字段名称('param1'
等):< / p>
In [278]:
import urlparse
In [279]:
T = ['http://example.com/?param1=apple¶m2=tomato¶m3=carrot',
'http://sample.com/?param1=banana¶m3=potato¶m4=berry',
'http://example.org/?param2=apple¶m3=tomato¶m4=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添加书签,它有很多有用的示例。