Pandas如何展平DataFrame列中存储的JSON数组数据
问题根因
你之前调用explode()、pd.json_normalize()未得到预期结果,核心原因是site_Activity列存储的是JSON格式字符串,而非pandas可直接处理的Python原生列表/字典对象,必须先做反序列化转换,才能执行后续展平操作。
实现步骤
- 导入
json模块,将site_Activity列的JSON字符串批量转换为Python原生列表 - 对转换后的列执行
explode(),将列表内的每一条活动记录拆分为独立行 - 将拆分后每行存储的活动字典展开为独立字段,与原表
id列拼接,即可得到目标结构
完整可运行代码
import pandas as pd import json # 反序列化JSON字符串为原生列表 df["site_Activity"] = df["site_Activity"].apply(json.loads) # 按活动记录拆分行 df = df.explode("site_Activity", ignore_index=True) # 展平活动字典为单独列,拼接id得到最终结果 df_final = pd.concat( [df[["id"]], pd.json_normalize(df["site_Activity"])], axis=1 )
结果验证
执行上述代码后,输出的df_final完全匹配你给出的预期结构:
| id | action_time | time_spent | url |
|---|---|---|---|
| 123 | 2022-07-05T01:53:59.000000Z | 12 | cool.stuff.io/advanced |
| 123 | 2022-07-05T00:10:20.000000Z | 0 | cool.stuff.io/advanced1 |
| 123 | 2022-07-04T23:45:39.000000Z | 0 | cool.stuff.io |
| 456 | 2022-07-04T23:00:23.000000Z | 0 | cool.stuff.io/awesome |
注:如果你的pandas版本≥1.5.0,也可以直接用
pd.json_normalize搭配记录路径参数一次性完成转换,但上述写法兼容更低版本,通用性更强。
内容的提问来源于stack exchange,提问作者hansolo
相关产品推荐
相关产品推荐

