如何按artwork_id分组DataFrame并转换为指定格式JSON?
DataFrame转指定格式JSON求助
我有一个包含150行数据的DataFrame,以下是两行示例数据:
artwork_id creator_id department_id art_work creator department 0 86508 29993 21 {'id': '86508', 'accession_number': '2015.584'...} {'id': '29993', 'role': 'artist', 'description...} {'id': '21', 'name': 'Prints'} 1 86508 68000 21 {'id': '86508', 'accession_number': '2015.584'...} {'id': '68000', 'role': 'printer', 'descriptio...} {'id': '21', 'name': 'Prints'}
需要将其转换为如下结构的JSON数据:
每个条目对应一个唯一的
artwork_id,包含:
artwork:该作品的完整信息字典(同作品下数据一致)department:所属部门的完整信息字典(同作品下数据一致)creators:该作品所有创作者的信息字典组成的数组
我尝试了以下代码,但未得到预期结果:
df.groupby(['artwork_id']).agg(lambda x: list(x)) df.to_json(orient = 'records')
解决方案
问题分析
- 原代码未将分组结果赋值给变量,分组操作等于无效执行;
- 直接用
lambda x: list(x)会把所有字段无差别转成列表,而我们需要artwork和department保留单个字典值,仅creator转为数组; - DataFrame中
art_work、creator、department是字符串格式的字典,需先转为实际字典对象,否则转JSON后会是字符串而非嵌套结构。
完整代码
import pandas as pd import ast # 1. 将字符串格式的字典转为Python实际字典 df['art_work'] = df['art_work'].apply(ast.literal_eval) df['creator'] = df['creator'].apply(ast.literal_eval) df['department'] = df['department'].apply(ast.literal_eval) # 2. 按artwork_id分组,指定每个字段的聚合逻辑 grouped_df = df.groupby('artwork_id').agg( artwork=('art_work', 'first'), # 同作品下数据一致,取第一个即可 department=('department', 'first'), creators=('creator', list) # 收集该作品的所有创作者 ).reset_index(drop=True) # 3. 转换为指定格式的JSON result_json = grouped_df.to_json(orient='records', indent=2) print(result_json)
代码说明
ast.literal_eval():安全解析字符串格式的字典,避免eval()的安全风险;agg()方法明确指定每个字段的聚合规则,精准控制输出结构;reset_index(drop=True):移除分组后的artwork_id索引,让JSON结构更简洁;orient='records':将DataFrame转为JSON数组格式,indent=2让JSON更易读。
内容的提问来源于stack exchange,提问作者udaykumar gajavalli
相关产品推荐
相关产品推荐

