如何将指定JSON转换为二级Multi-index的Pandas DataFrame?
构建指定二级Multi-index DataFrame解决方案
原始数据
data = { 'Low': { '2023.07.01': {"u": "mo", 'N': 1, 'O': 2, "PN": 22, "PO": 34}, '2023.07.02': {"u": "no", 'N': 1, 'O': 2, "PN": 22, "PO": 34} }, 'Medium': { '2023.07.01': {"u": "no", 'N': 1, 'O': 2, "PN": 22, "PO": 34}, '2023.07.02': {"u": "mo", 'N': 1, 'O': 2, "PN": 22, "PO": 34} }, 'High': { '2023.07.01': {"u": "no", 'N': 122, 'O': 2, "PN": 212, "PO": 334}, '2023.07.02': {"u": "mo", 'N': 13, 'O': 2, "PN": 2, "PO": 342} } }
实现步骤
方法:先转长格式再重塑宽格式
这种方式更直观,便于精准控制最终的索引和列结构:
拆解嵌套字典为长格式DataFrame
将多层嵌套的数据转换为单条记录的行格式,为后续重塑做准备:import pandas as pd rows = [] for level, date_data in data.items(): for date, values in date_data.items(): rows.append({ 'Date': date, 'U': values['u'], 'Level': level, 'N': values['N'], 'O': values['O'], 'PN': values['PN'] }) long_df = pd.DataFrame(rows)重塑为二级列索引的宽格式
使用pivot方法将Date和U设为行索引,Level和指标设为二级列索引:wide_df = long_df.pivot(index=['Date', 'U'], columns='Level')调整列顺序并重复PN列
按照需求构造目标列顺序,复制PN列到指定位置:# 定义目标列顺序:每个Level下依次为N、PN、O、PN desired_cols = [] for level in ['Low', 'Medium', 'High']: desired_cols.extend([(level, 'N'), (level, 'PN'), (level, 'O'), (level, 'PN')]) # 复制PN列以满足重复展示需求 final_df = wide_df.copy() for level in ['Low', 'Medium', 'High']: final_df[(level, 'PN')] = wide_df[(level, 'PN')] # 按目标顺序重新排列列 final_df = final_df[desired_cols] # 可选:填充空值(根据业务需求选择,示例用0填充) final_df.fillna(0, inplace=True)
最终结果
运行后final_df的结构如下:
Low Medium High N PN O PN N PN O PN N PN O PN Date U 2023.07.01 mo 1 22 2 22 0 0 0 0 0 0 0 0 no 0 0 0 0 1 22 2 22 122 212 2 212 2023.07.02 mo 0 0 0 0 1 22 2 22 13 2 2 2 no 1 22 2 22 0 0 0 0 0 0 0 0
内容的提问来源于stack exchange,提问作者ASHu2
相关产品推荐
相关产品推荐

