如何访问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
相关产品推荐
相关产品推荐

