如果我有列数据,例如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
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']}
这是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 = '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']