如何使用pandas将含字典列表的DataFrame列展开为结构化长表
解答
使用pandas完全可以实现该嵌套结构转长表的需求,全程无需额外依赖,操作步骤如下:
核心思路
- 先用
explode()方法将actions列中存储的列表拆分为独立行,保证每个字典和原id一一对应 - 再用
pd.json_normalize()把每行的字典结构展开为普通列 - 最后筛选需要保留的
id、action_type、value三个字段即可
完整可运行代码
import pandas as pd # 构造与描述一致的示例数据源 df = pd.DataFrame({ 'id': [1, 2], 'actions': [ [ {"action_type":"link_click","value":"1","1d_click":"1","7d_click":"1"}, {"action_type":"page_engagement","value":"2","1d_click":"2","7d_click":"2"} ], [ {"action_type":"link_click","value":"2","1d_click":"2","7d_click":"2"}, {"action_type":"page_engagement","value":"2","1d_click":"2","7d_click":"2"} ] ] }) # 步骤1:拆分actions列的列表为独立行 df_explode = df.explode(column='actions', ignore_index=True) # 步骤2:展开字典结构为普通列,与原id列拼接 df_expand = pd.concat( [df_explode[['id']], pd.json_normalize(df_explode['actions'])], axis=1 ) # 步骤3:筛选目标字段 final_df = df_expand[['id', 'action_type', 'value']]
运行后final_df的输出结构和预期长表完全一致:
id action_type value 0 1 link_click 1 1 1 page_engagement 2 2 2 link_click 2 3 2 page_engagement 2
注:该方法兼容pandas 1.0及以上所有正式版本,数据量较大时,执行效率远高于逐行apply循环的写法。
内容的提问来源于stack exchange,提问作者Eonsworld
相关产品推荐
相关产品推荐

