Pandas如何转换JSON为DataFrame并展开字典列表列
Pandas嵌套JSON列表转宽表实现方案
pandas完全可以实现你描述的转换需求,以下是可直接复用的操作方法:
方法1:通用兼容写法(适合action_type动态变化的场景)
该方法不需要提前预知actions里包含的动作类型,新增动作类型会自动生成对应列。
- 首先导入依赖,加载原始数据
import pandas as pd import ast # 构造示例原始数据,实际使用时替换为你的数据读取逻辑 df = pd.DataFrame({ 'id': ['Obj1', 'Obj2', 'Obj4'], 'name': ['val1', 'val1', 'val1'], 'actions': [ [{'action_type': 'link_click', 'value': '40'}, {'action_type': 'page_engagement', 'value': '546'}], [{'action_type': 'link_click', 'value': '10'}, {'action_type': 'page_engagement', 'value': '200'}], [{'action_type': 'link_click', 'value': '20'}, {'action_type': 'page_engagement', 'value': '100'}] ] }) # 若actions列存储的是JSON字符串而非原生Python列表/字典,先执行类型转换 # df['actions'] = df['actions'].apply(ast.literal_eval)
- 执行结构转换
# 1. 炸开actions列的列表,每个字典单独占一行,保留原id、name关联 df_exploded = df.explode('actions', ignore_index=True) # 2. 把嵌套字典展开为普通列 df_flatten = pd.concat([ df_exploded[['id', 'name']], pd.json_normalize(df_exploded['actions']) ], axis=1) # 3. 行转列得到最终宽表结构 result = df_flatten.pivot(index=['id', 'name'], columns='action_type', values='value').reset_index() # 清理透视表残留的索引名 result.columns.name = None
运行后输出的result和你需要的结构完全一致:
id name link_click page_engagement 0 Obj1 val1 40 546 1 Obj2 val1 10 200 2 Obj4 val1 20 100
方法2:简洁写法(适合已知固定action_type的场景)
如果你的actions里的动作类型固定,可以直接用字典映射快速转换,代码更短:
# 把每行的actions列表转为{action_type:value}的字典,再展开为列 action_df = df['actions'].apply(lambda x: {item['action_type']: item['value'] for item in x}).apply(pd.Series) # 拼接原有id、name列,删除原actions列 result = pd.concat([df[['id', 'name']], action_df], axis=1)
注意:如果value字段后续需要做数值计算,可以在转换后加一步
result[['link_click', 'page_engagement']] = result[['link_click', 'page_engagement']].astype(int)把字符串转成整数类型。
内容的提问来源于stack exchange,提问作者Eonsworld
相关产品推荐
相关产品推荐

