带非唯一索引的DataFrame按索引导出目标格式JSON的方法
处理带重复索引的DataFrame转特定格式JSON的问题
我完全理解你遇到的痛点:当DataFrame存在重复索引时,直接用df.to_json(orient='index')没法生成你想要的格式——重复索引对应的多行数据需要转为数组,唯一索引的单行数据则保持单个对象结构。
先确认下你的DataFrame结构:
import pandas as pd df = pd.DataFrame({'city': ['POA', 'POA', 'SAN'], 'info' : [10,12,5]}, index = [4314902, 4314902, 4300803]) df.index.rename('ID_city', inplace=True)
对应的表格展示:
city info ID_city 4314902 POA 10 4314902 POA 12 4300803 SAN 5
要实现你期望的JSON输出,我们可以通过按索引分组+自定义格式转换来解决,具体代码如下:
import json # 按索引分组处理数据 result = {} for idx, group in df.groupby(level='ID_city'): # 将分组内的数据转为字典列表(records格式) group_data = group.reset_index(drop=True).to_dict('records') # 单个数据时取字典,多个数据时保留列表 result[idx] = group_data[0] if len(group_data) == 1 else group_data # 写入JSON文件,indent=2保证格式美观易读 with open('df.json', 'w') as f: json.dump(result, f, indent=2)
代码逻辑说明:
df.groupby(level='ID_city'):按索引ID_city分组,把相同索引的行归为一组;group.reset_index(drop=True).to_dict('records'):将每组数据转为字典列表,reset_index(drop=True)是为了去掉分组后的冗余索引,只保留列数据;- 最后通过判断分组数据的长度,决定存储单个字典还是字典列表,完美匹配你想要的输出结构。
执行这段代码后,生成的df.json内容就是你期望的:
{ "4314902": [ {"city": "POA", "info": 10}, {"city": "POA", "info": 12} ], "4300803": {"city": "SAN", "info": 5} }
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

