将含列表式列与值的JSON数据标准化为Pandas DataFrame
解决列名与数据分离的JSON转Pandas DataFrame问题
核心思路
你的JSON结构属于列名和数据行分离存储的类型,pd.json_normalize是为嵌套键值对JSON设计的,自然没法直接处理这种结构。直接提取列名列表和数据列表,用pd.DataFrame构造才是最直接的方案。
基础场景示例
假设你的JSON数据结构如下:
{ "meta": {"source": "sensor_data"}, "columns": ["timestamp", "temperature", "humidity"], "data": [ ["2024-05-20 10:00", 25.6, 60], ["2024-05-20 10:05", 25.8, 59], ["2024-05-20 10:10", 26.0, 58] ] }
对应的处理代码:
import pandas as pd import json # 加载JSON为字典(如果是文件的话用json.load()) json_data = json.loads(your_json_string) # 或者从文件读取:json.load(open("data.json")) # 直接用列名和数据构造DataFrame df = pd.DataFrame(data=json_data["data"], columns=json_data["columns"]) # 如果需要保留meta里的附加信息,把它合并到每一行 meta_info = pd.json_normalize(json_data["meta"]) # 把meta数据广播到所有行 df = pd.concat([df, meta_info.loc[meta_info.index.repeat(len(df))].reset_index(drop=True)], axis=1)
复杂嵌套分组场景
如果JSON里包含多个分组,每个分组都有独立的列名和数据,遍历分组逐个处理后合并即可:
# 示例嵌套JSON complex_json = { "groups": [ { "group_name": "room1", "columns": ["timestamp", "temp"], "data": [["2024-05-20", 25], ["2024-05-21", 26]] }, { "group_name": "room2", "columns": ["timestamp", "temp"], "data": [["2024-05-20", 24], ["2024-05-21", 25]] } ] } dfs = [] for group in complex_json["groups"]: temp_df = pd.DataFrame(group["data"], columns=group["columns"]) temp_df["group_name"] = group["group_name"] dfs.append(temp_df) final_df = pd.concat(dfs, ignore_index=True)
为什么pd.json_normalize没用?
pd.json_normalize的作用是把嵌套的JSON对象(比如每个数据项是{"timestamp": "...", "temp": 25}这种键值对)展平成表格。而你的结构是列名统一存成一个列表,数据是对应位置的列表,这种情况下json_normalize会把columns和data当成普通字段,自然会出现列名变成单元格值的问题。
内容的提问来源于stack exchange,提问作者alextc
相关产品推荐
相关产品推荐

