python - Pandas 将用户代理列解析为多列

标签 python pandas user-agent

我有一个 http 请求日志的数据框。唯一相关的列是我正在尝试解析的 userAgent 列。我正在使用 ua_parser。这会将每个 userAgent 变成一个嵌套字典,如下所示:

>>> from ua_parser import user_agent_parser
>>> user_agent_parser.Parse('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36')
{
     'device': {'brand': None, 
                'model': None, 
                'family': 'Other'}, 
     'os': {'major': '10', 
            'patch_minor': None, 
            'minor': '10', 
            'family': 'Mac OS X', 
            'patch': '5'}, 
     'user_agent': {'major': '55', 
                    'minor': '0', 
                    'family': 'Chrome', 
                    'patch': '2883'}, 
     'string': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'
}

我正在尝试使用 user_agent_parser 的结果在日志数据帧上创建 4 个附加列。我想要 device_brand、device_model、os_family 和 user_agent_family 列。

不幸的是,当我将其存储为 numpy 数组时,我无法访问字典索引:

>>> parsed_ua = logs['userAgent'].apply(user_agent_parser.Parse)
>>> logs['device_brand'] = parsed_ua['device']['brand']
KeyError: 'device'

我尝试将其转换为数据帧,以便我可以将 parsed_ua 与日志合并。不幸的是,这会将每个字典写入单个列

>>> pd.DataFrame(parsed_ua)
userAgent
0   {u'device': {u'brand': None, u'model': None, u...
1   {u'device': {u'brand': None, u'model': None, u...
2   {u'device': {u'brand': None, u'model': None, u...
3   {u'device': {u'brand': None, u'model': None, u...
4   {u'device': {u'brand': None, u'model': None, u...

如何解析 userAgent 列并将结果写入多个列?

最佳答案

您可以使用json_normalize()方法:

In [146]: pd.io.json.json_normalize(parsed_ua)
Out[146]:
  device.brand device.family device.model os.family os.major os.minor  \
0         None         Other         None  Mac OS X       10       10

  os.patch os.patch_minor                                   string  \
0        5           None  Mozilla/5.0 (Macintosh; Intel Mac OS...

  user_agent.family user_agent.major user_agent.minor user_agent.patch
0            Chrome               55                0             2883

关于python - Pandas 将用户代理列解析为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41840862/

相关文章:

http - 网站不接受 wget 用户代理 header

python - VIM python 文件类型特定缩进在一个列表的 50 行后失败

python - 如何强制颜色映射到大于 matplotlib 中 imshow 的特定输入的动态范围

python - 使用 feedparser 访问重复的 feed 标签

python - 查找特定的顺序模式

python - Pandas 从数据框中选择不连续的列

python - 重命名数据框中的元组列名称

internet-explorer-9 - 解码IE9用户代理

javascript - 使用 python 抓取从网页中嵌入的传单应用程序获取坐标

http - 为什么用户代理在服务器重置 TCP 后重新提交请求?