You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套JSON转换为指定列的Pandas DataFrame?解决列名异常

问题:从嵌套JSON生成指定列的Pandas DataFrame

API输出的JSON结构如下:

[
{
    "Data": {
        "SensorId": "EF00BFC0",
        "SensorName": "DEVICE 05",
        "TimeStamp": 3877552823
    },
    "ThresholdValue": {
        "SensorSubId": 1,
        "ThresholdMax": -1,
        "ThresholdMin": -1
    },
    "startUTC": 1668564000,
    "endUTC": 1668663000
},
{
    "Data": {
        "SensorId": "EF00BFC0",
        "SensorName": "DEVICE 05",
        "TimeStamp": 3877553446
    },
    "ThresholdValue": {
        "SensorSubId": 1,
        "ThresholdMax": -1,
        "ThresholdMin": -1
    },
    "startUTC": 1668564000,
    "endUTC": 1668663000
}
]

需要生成包含SensorId、SensorName、TimeStamp、startUTC、endUTC列的Pandas DataFrame,尝试了以下代码但出现列名变为行的异常:

df_nested_list = pd.json_normalize(
    data, 
    record_path =['Data'], 
    meta=['startUTC', 'endUTC']
)

解决方案

问题出在record_path=['Data']的使用:Data是单个对象而非数组,指定该参数会让json_normalize错误地将对象的键值对拆分为行,导致列行颠倒。以下两种方法可以正确实现需求:

方法一:简化json_normalize调用

不指定record_path,让工具自动解析嵌套结构后筛选列:

import pandas as pd

# 假设data为你的JSON数据
df = pd.json_normalize(data)
# 筛选目标列(嵌套列会自动带上前缀)
df = df[['Data.SensorId', 'Data.SensorName', 'Data.TimeStamp', 'startUTC', 'endUTC']]
# 重命名列去掉前缀
df.columns = ['SensorId', 'SensorName', 'TimeStamp', 'startUTC', 'endUTC']

方法二:手动提取字段构建DataFrame

遍历JSON条目,直接提取需要的字段:

import pandas as pd

rows = []
for item in data:
    rows.append({
        'SensorId': item['Data']['SensorId'],
        'SensorName': item['Data']['SensorName'],
        'TimeStamp': item['Data']['TimeStamp'],
        'startUTC': item['startUTC'],
        'endUTC': item['endUTC']
    })

df = pd.DataFrame(rows)

两种方法都能生成符合要求的DataFrame,第二种方法逻辑更直观,无需处理嵌套列名的问题。


内容的提问来源于stack exchange,提问作者Niro Mal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:40:42