You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问DataFrame列中列表内嵌套字典的值并新增goalName列

问题描述

我从Google Analytics Reporting API获取了名为response的JSON文件,结构如下:

{
  "sessions": [
    {
      "sessionId": "1632227669",
      "deviceCategory": "desktop",
      "platform": "Windows",
      "dataSource": "web",
      "activities": [
        {
          "activityTime": "2021-09-21T12:45:54.236723Z",
          "source": "google",
          "medium": "organic",
          "channelGrouping": "Organic Search",
          "campaign": "(not set)",
          "keyword": "(not provided)",
          "landingPagePath": "/blog-entry/",
          "activityType": "GOAL",
          "goals": {
            "goals": [
              {
                "goalName": "GOAL NAME"
              }
            ]
          }
        }
      ]
    }
  ]
}

我需要将其转换为表格,activityTime是唯一标识符,部分activities包含goals,其余对应pageviews、events类型。我使用如下代码转换:

df = pd.json_normalize(response['sessions'], 
                       record_path=['activities'],
                       meta=['sessionId','deviceCategory','platform'])

运行后生成了表格,但df['goals.goals']列的值要么是NaN,要么是字典列表。请问如何访问列表内字典的键值,特别是新增名为goalName的列并追加到df中?

解决方法

你可以直接用pandas的str系列访问器处理列表和字典类型的列,代码简洁且自动兼容NaN值场景:

单Goal场景(对应你给出的JSON结构)

如果每个goals.goals列表最多只有1个Goal对象,直接执行以下单行代码即可:

df['goalName'] = df['goals.goals'].str[0].str.get('goalName')

代码逻辑说明:

  • df['goals.goals'].str[0]:提取列表的第一个元素,如果该行goals.goals是NaN或者空列表,自动返回NaN
  • .str.get('goalName'):从提取出的字典中取goalName对应的值,如果不是字典或者没有对应键,自动返回NaN,正好匹配非GOAL类型活动的填充需求

多Goal场景

如果业务中存在单个activity对应多个Goal的情况,可以用apply把多个goalName拼接为字符串:

df['goalName'] = df['goals.goals'].apply(
    lambda x: ';'.join([item['goalName'] for item in x]) if isinstance(x, list) else pd.NA
)

内容的提问来源于stack exchange,提问作者Oleh Bohoslavets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:39:04