首页 > 解决方案 > 将 URL 参数解析为单独的列

问题描述

我有一个带有 URL 列的数据框,如果 URL 中存在指定参数的值,我想根据指定参数的值将其解析为带有行的新列。我正在使用一个函数,该函数循环遍历数据框列中的每一行并解析指定的 URL 参数,但是当我在函数完成后尝试选择该列时,我得到一个 keyError。我应该以不同的方式将值设置为这个新列吗?有没有比遍历表中的值并运行此过程更有效的方法?

错误:

KeyError: 'utm_source'

示例网址 ( df['landing_page_url']):

https://lp.example.com/test/lp
https://lp.example.com/test/ny/?utm_source=facebook&ref=test&utm_campaign=ny-newyork_test&utm_term=nice
https://lp.example.com/test/ny/?utm_source=facebook
NaN
https://lp.example.com/test/la/?utm_term=lp-test&utm_source=facebook

代码:

import pandas as pd
import numpy as np
import math
from urllib.parse import parse_qs, urlparse

def get_query_field(url, field):
    if isinstance(url, str):
        try:
            return parse_qs(urlparse(url).query)[field][0]
        except KeyError:
            return ''
    else:
        return ''


for i in df['landing_page_url']:
    print(i) // returns URL
    print(get_query_field(i, 'utm_source')) // returns proper values
    df['utm_source'] == get_query_field(i, 'utm_source')
    df['utm_campaign'] == get_query_field(i, 'utm_campaign')
    df['utm_term'] == get_query_field(i, 'utm_term')

标签: pythonpandas

解决方案


代替

try:
   return parse_qs(urlparse(url).query)[field][0]
except KeyError:
   return ''

你可以这样做:

return parse_qs(urlparse(url).query).get(field, [''])[0]

这里的诀窍是my_dict.get(key, default)代替my_dict[key]. 如果 key 不存在,将返回默认值

有没有比遍历表中的值并运行此过程更有效的方法?

并不真地。无论哪种方式,都必须遍历每个 url。但现在,您正在覆盖每个 url 的数据框。这意味着如果两个不同的 URL 在查询中具有不同的来源,则列表中的最后一个将获胜。我不知道这是不是故意的。

另请注意:这一行

df['utm_source'] == get_query_field(i, 'utm_source')

实际上是没有做任何事情。==是一个比较运算符,“左侧是否与右侧匹配”。您可能打算使用=df.append({'utm_source': get_query_field(..)})


推荐阅读