Pythonic方式实现Pandas DataFrame转指定格式JSON
Pandas DataFrame转嵌套JSON的Pythonic实现
假设你的目标嵌套结构是按userId聚合,每个用户下包含多次visit记录,每次visit包含总阅读时长及该次访问的书籍列表(如示例JSON结构),可以用Pandas的groupby+apply链式操作实现,完全避免手动嵌套循环:
示例数据与目标结构
输入DataFrame
import pandas as pd df = pd.DataFrame({ 'userId': ['u1', 'u1', 'u2'], 'visitId': ['v1', 'v1', 'v2'], 'readingTime': [30, 20, 45], 'Books': ['Python入门', '数据分析实战', '机器学习'], 'BookType': ['编程', '编程', 'AI'] })
目标嵌套JSON结构
[ { "userId": "u1", "visits": [ { "visitId": "v1", "totalReadingTime": 50, "books": [ {"bookName": "Python入门", "bookType": "编程", "readingTime": 30}, {"bookName": "数据分析实战", "bookType": "编程", "readingTime": 20} ] } ] }, { "userId": "u2", "visits": [ { "visitId": "v2", "totalReadingTime": 45, "books": [ {"bookName": "机器学习", "bookType": "AI", "readingTime": 45} ] } ] } ]
实现代码
import pandas as pd import json # 处理单条visit的逻辑 def process_single_visit(visit_group): return { "visitId": visit_group["visitId"].iloc[0], "totalReadingTime": visit_group["readingTime"].sum(), "books": visit_group.apply( lambda row: { "bookName": row["Books"], "bookType": row["BookType"], "readingTime": row["readingTime"] }, axis=1 ).tolist() } # 分层聚合生成嵌套结构 nested_data = ( df.groupby("userId", as_index=False) .apply( lambda user_group: { "userId": user_group["userId"].iloc[0], "visits": user_group.groupby("visitId").apply(process_single_visit).tolist() }, include_groups=False # Pandas 2.0+ 参数,避免分组键混入结果 ) .tolist() ) # 转为格式化JSON json_result = json.dumps(nested_data, ensure_ascii=False, indent=2) print(json_result)
关键说明
- 分层分组:先按
userId聚合用户级数据,再在每个用户组内按visitId聚合单次访问数据,完全利用Pandas的分组能力替代手动循环。 - 自定义处理函数:
process_single_visit负责将单组visit数据转换为目标嵌套结构,包括计算总阅读时长、生成书籍列表。 - 版本适配:
include_groups=False是Pandas 2.0+新增参数,符合你使用的2.1.4版本,确保分组键不会额外出现在结果中。
内容的提问来源于stack exchange,提问作者APS
相关产品推荐
相关产品推荐

