如何将Pandas DataFrame按laterality列转换为嵌套JSON?
问题描述
我有一个Python Pandas DataFrame,需要根据laterality列的条目将其转换为嵌套JSON。
我的DataFrame如下:
import pandas as pd df1 = pd.DataFrame({'id': [1, 1, 1, 2], 'laterality': ['L', 'L', 'R', 'R'], 'image': ['im1', 'im2', 'im3', 'im4'], 'number': [5, 5, 5, 6] })
期望的JSON输出为:
[ { "id": 1, "number": 5, "images L": ["im1", "im2"], "images R": ["im3"] }, { "id": 2, "number": 6, "images R": ["im4"] } ]
我尝试的方法:
我尝试使用.to_dict()方法对记录进行分组,但尚未解决问题,代码如下:
json1 = (df1.groupby(['id','number']) .apply(lambda x: x[['laterality','image']].to_dict('records')) .reset_index() .rename(columns={0:'image'}) .to_json(orient='records'))
参考过的相关主题:
- 更Python化的方式从元组列表格式化JSON字符串
- 将Pandas DataFrame转换为嵌套JSON
- 将Pandas DataFrame转换为JSON格式
解决方案
可以通过分组后对laterality和image进行二次聚合,再将结果整理成目标格式,代码如下:
import pandas as pd import json # 定义分组后的处理逻辑 def process_group(group): # 按laterality分组,收集对应image列表 lateral_image_map = group.groupby('laterality')['image'].apply(list).to_dict() # 转换为目标键名格式 image_fields = {f"images {k}": v for k, v in lateral_image_map.items()} # 组合id、number和图片字段 return { 'id': group['id'].iloc[0], 'number': group['number'].iloc[0], **image_fields } # 执行分组处理并转为JSON result_list = df1.groupby(['id', 'number'], as_index=False).apply(process_group).tolist() json_result = json.dumps(result_list, indent=2) print(json_result)
逻辑说明
- 外层按
id和number分组,确保每个组对应目标JSON中的一个独立对象; - 对内层每组数据,再次按
laterality分组,将同侧的image聚合为列表; - 将聚合得到的字典键名转换为
"images L"这类目标格式,再补充id和number字段; - 最后将处理后的结果转为列表,用
json.dumps格式化输出。
也可以用更简洁的链式写法实现:
json_result = json.dumps( df1.groupby(['id', 'number']) .apply(lambda g: { 'id': g.name[0], 'number': g.name[1], **{f"images {k}": v for k, v in g.groupby('laterality')['image'].apply(list).items()} }) .tolist(), indent=2 )
内容的提问来源于stack exchange,提问作者Jeromekem
相关产品推荐
相关产品推荐

