Pandas构建深层嵌套JSON时如何对Item数组去重并正确分组
Excel转Header/Item双层嵌套JSON去重方案
问题根因
原有实现出现Item重复的核心原因是分组聚合前未对明细行做去重处理,原始Excel中的重复行被直接聚合进Item数组;同时原代码存在两处语法疏漏:
- 生成Item字段时
df[['A', 'C', 'D'].to_dict('records')缺失右侧闭合中括号 - 分组后取多列字段时使用单中括号
data_groupedby['A','B','Item'],pandas取多列需要传入列名列表、使用双中括号。
修复实现
核心逻辑为先按Item维度的唯一键去重原始明细,再分组聚合,聚合时增加去重兜底逻辑,完整可运行代码如下:
import pandas as pd import json # 1. 读取Excel数据源,替换为实际文件路径 df = pd.read_excel("your_source_file.xlsx") # 2. 按Item维度的唯一判定字段去重,从源头删除重复行,保留第一条记录 # 若去重规则变化,修改subset内的字段名即可 df_dedup = df.drop_duplicates(subset=["A", "C", "D"], keep="first").reset_index(drop=True) # 3. 生成Item层级的字典结构 df_dedup["Item"] = df_dedup[["A", "C", "D"]].to_dict("records") # 4. 自定义聚合函数,对Item列表做二次去重兜底 def dedup_items(item_list): # 字典不可哈希,转为可哈希的元组结构完成去重后再转回字典 return list({tuple(sorted(item.items())): item for item in item_list}.values()) # 5. 按Header维度(A、B字段)分组聚合 data_grouped = df_dedup.groupby(["A", "B"], as_index=False).agg({ "Item": dedup_items }) # 6. 输出格式化JSON,ensure_ascii=False避免中文乱码 result = json.dumps(data_grouped.to_dict("records"), indent=2, ensure_ascii=False) print(result)
最终输出效果
运行代码后将得到无重复Item的符合预期的嵌套结构:
[ { "A": 100, "B": "Test1", "Item": [ { "A": 100, "C": "XX10", "D": "L" }, { "A": 100, "C": "XX20", "D": "L" } ] }, { "A": 101, "B": "Test2", "Item": [ { "A": 101, "C": "XX10", "D": "L" }, { "A": 101, "C": "XX20", "D": "L" } ] } ]
可选调整
- 若需要将Header抽为独立嵌套层级,可在分组完成后新增一行代码:
data_grouped["Header"] = data_grouped[["A", "B"]].to_dict("records"),再调整最终输出的字段选取顺序即可 - 若业务中Item的重复判定规则有变化,仅需修改
drop_duplicates的subset参数,传入对应字段名即可 - 若不需要格式化输出,可直接使用
data_grouped.to_json(orient='records', force_ascii=False)获取JSON字符串
内容的提问来源于stack exchange,提问作者Chakraborty
相关产品推荐
相关产品推荐

