如何在Pandas中将深度嵌套JSON数据扁平化为指定结构的DataFrame
问题
我有一份嵌套程度较深的JSON数据,其中存储了不同“产品”的情感指标,我希望将该数据加载为Pandas DataFrame,将以下字段存储为独立列:
- product name(产品名称)
- language(语言)
- sentiment(情感类型)
- platform(平台)
- started date(开始日期)
- ended date(结束日期)
- value(数值)
注意:完整数据载荷中的所有产品名称均不相同。当前片段展示的是engagement的情感指标,实际数据还包含其他类型的情感指标。
示例JSON结构:
{ "product_ABC": { "en": { "engagement": { "Twitch": { "series": [ { "started_at": "2021-10-05 00:00:00 -0700", "ended_at": "2021-10-06 00:00:00 -0700", "value": 17274 }, { "started_at": "2021-10-06 00:00:00 -0700", "ended_at": "2021-10-07 00:00:00 -0700", "value": 11354 } ] }, "Youtube": { "series": [ { "started_at": "2021-10-05 00:00:00 -0700", "ended_at": "2021-10-06 00:00:00 -0700", "value": 76 }, { "started_at": "2021-10-06 00:00:00 -0700", "ended_at": "2021-10-07 00:00:00 -0700", "value": 28 } ] } } } } }
最终需要得到扁平化结构的DataFrame。
解决方案
你可以通过逐层遍历JSON嵌套结构,把每层的关键信息和底层的时间序列数据拼接,最终转换为DataFrame,代码如下:
import pandas as pd import json # 加载本地JSON文件,替换为你自己的文件路径 with open("你的JSON数据文件路径.json", "r", encoding="utf-8") as f: data = json.load(f) # 存储所有行记录的临时列表 records = [] # 遍历第一层:产品名称 for product_name, lang_map in data.items(): # 遍历第二层:语言 for language, sentiment_map in lang_map.items(): # 遍历第三层:情感类型 for sentiment, platform_map in sentiment_map.items(): # 遍历第四层:平台 for platform, series_info in platform_map.items(): # 遍历时间序列明细 for item in series_info["series"]: records.append({ "product name": product_name, "language": language, "sentiment": sentiment, "platform": platform, "started date": item["started_at"], "ended date": item["ended_at"], "value": item["value"] }) # 转换为DataFrame df = pd.DataFrame(records)
运行后得到的df就是你需要的扁平化表格,兼容多情感类型、多产品、多语言的场景,只要JSON结构和示例一致就无需修改代码。
输出示例:
| product name | language | sentiment | platform | started date | ended date | value |
|---|---|---|---|---|---|---|
| product_ABC | en | engagement | Twitch | 2021-10-05 00:00:00 -0700 | 2021-10-06 00:00:00 -0700 | 17274 |
| product_ABC | en | engagement | Twitch | 2021-10-06 00:00:00 -0700 | 2021-10-07 00:00:00 -0700 | 11354 |
| product_ABC | en | engagement | Youtube | 2021-10-05 00:00:00 -0700 | 2021-10-06 00:00:00 -0700 | 76 |
| product_ABC | en | engagement | Youtube | 2021-10-06 00:00:00 -0700 | 2021-10-07 00:00:00 -0700 | 28 |
内容的提问来源于stack exchange,提问作者phatboss
相关产品推荐
相关产品推荐

