You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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')

解决方案

问题分析

  1. 原代码未将分组结果赋值给变量,分组操作等于无效执行;
  2. 直接用lambda x: list(x)会把所有字段无差别转成列表,而我们需要artwork和department保留单个字典值,仅creator转为数组;
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:35:29