Python:切片/转换URL以获取项目和项目计数

Python:切片/转换URL以获取项目和项目计数,python,pandas,Python,Pandas,如果我有列数据,例如100个条目属于两种格式;在列名称URL下: http//mysportswebsite.com/shop/?Baseball+Bat=5 http//memoribilia.com/checkout?autograph=1 如何提取购买的物品和编号 理想情况下,我希望添加新列(如果它们还不存在),因为在本例中,棒球棒和签名,然后将各自的计数5和1添加到它们的列中(或者仅添加到列中,如果它们存在于之前的示例中),以根据此数据推断购买计数 我想对python中的整个URL列

如果我有列数据,例如100个条目属于两种格式;在列名称URL下:

http//mysportswebsite.com/shop/?Baseball+Bat=5

http//memoribilia.com/checkout?autograph=1
如何提取购买的物品和编号

理想情况下,我希望添加新列(如果它们还不存在),因为在本例中,棒球棒和签名,然后将各自的计数5和1添加到它们的列中(或者仅添加到列中,如果它们存在于之前的示例中),以根据此数据推断购买计数

我想对python中的整个URL列执行此操作,对于这个问题(信息有点有限),我建议:

如果您的df如下所示:

df = pd.DataFrame(data={"url": ["http//mysportswebsite.com/shop/?Baseball+Bat=5", "http//memoribilia.com/checkout?autograph=1"]})

                                              url
0  http//mysportswebsite.com/shop/?Baseball+Bat=5
1      http//memoribilia.com/checkout?autograph=1
您可以这样做:

df['product_count_tuple'] = df.url.apply(lambda x: x.split('?')[1].split('='))
df['product'] = df.product_count_tuple.apply(lambda x: x[0].replace('+', ' '))
df['count'] = df.product_count_tuple.apply(lambda x: x[1])
df = df.drop('product_count_tuple', 1)
其结果是:

                                              url       product count
0  http//mysportswebsite.com/shop/?Baseball+Bat=5  Baseball Bat     5
1      http//memoribilia.com/checkout?autograph=1     autograph     1

以下是使用
re
模块的另一种方法:

import re
df['item'] = df['URL'].apply(lambda x: (re.findall('\?(.*)=', x)[0]).replace('+', ' '))
df['count'] = df['URL'].apply(lambda x: int((re.findall('=(.*)', x)[0])))

Python已经有了解析URL的库

>>> import urllib.parse as urlparse
>>> url = 'http//mysportswebsite.com/shop/?Baseball+Bat=5'
>>> parsed_url = urlparse.urlparse(url)
>>> params = urlparse.parse_qs(parsed_url.query)
>>> print(params)
{'Baseball Bat': ['5']}

在纯Python中,一种方法是在“?”处拆分字符串,获取第二个组件,然后在“=”处再次拆分

url = 'http://mysportswebsite.com/shop/?Baseball+Bat=5'
item, count = url.split('?')[1].split('=')
您可以使用
apply
在列上运行此操作,但是,如果有大量URL,则对同一操作使用内置字符串方法更有效。语法非常相似

data = pd.Series([
    'http://mysportswebsite.com/shop/?Baseball+Bat=5',
    'http//memoribilia.com/checkout?autograph=1'])
df = data.str.split('?', expand=True)[1].str.split('=', expand=True)
df.columns = ['item', 'count']

谢谢你的回答。如果问题因某些URL类似于http//memoribilia.com/checkout?autograph=1&barball+Bat=2&globets=2这样的事实而变得更加复杂,那么在这种情况下,您可以使用希望的输出方式更新您的问题吗?