如何将嵌套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
相关产品推荐
相关产品推荐

