如何实现Pandas DataFrame到指定自定义JSON格式的转换?
将Pandas DataFrame转换为自定义结构的JSON
原始DataFrame
date aid x_axis y_axis z_axis 0 2018-12-01 9.0 -0.71 8.75 5.23 1 2018-12-03 3.0 -0.55 10.13 1.15 2 2018-12-03 4.0 -1.84 4.56 5.74 3 2018-12-03 5.0 -1.49 4.11 7.03 4 2018-12-03 7.0 -0.40 0.83 -8.29 5 2018-12-04 4.0 -9.04 -0.04 0.55 6 2018-12-05 1.0 -3.03 6.20 7.16 7 2018-12-05 4.0 -3.93 7.69 3.82 8 2018-12-05 5.0 -4.00 7.75 1.01 9 2018-12-06 5.0 -4.47 6.79 4.12
预期JSON格式
[ { "date": "2018-12-01", "9": { "mean": { "x_axis": -0.71, "y_axis": 8.75, "z_axis": 5.23 } } }, { "date": "2018-12-03", "3": { "mean": { "x_axis": -0.55, "y_axis": 10.13, "z_axis": 1.15 } }, "4": { "mean": { "x_axis": -1.84, "y_axis": 4.56, "z_axis": 5.74 } }, "5": { "mean": { "x_axis": -1.49, "y_axis": 4.11, "z_axis": 7.03 } }, "7": { "mean": { "x_axis": -0.4, "y_axis": 0.83, "z_axis": -8.29 } } } ]
原有代码的问题
之前的代码输出存在以下问题:
- 顶级结构以
date为键,而非预期的对象数组 aid保留了浮点数后缀.0- 多了原始行索引的层级,且缺少
mean包裹层
解决方案代码
import pandas as pd import json # 构造原始DataFrame(如果已有可跳过此步) data3 = pd.DataFrame({ 'date': ['2018-12-01', '2018-12-03', '2018-12-03', '2018-12-03', '2018-12-03', '2018-12-04', '2018-12-05', '2018-12-05', '2018-12-05', '2018-12-06'], 'aid': [9.0, 3.0, 4.0, 5.0, 7.0, 4.0, 1.0, 4.0, 5.0, 5.0], 'x_axis': [-0.71, -0.55, -1.84, -1.49, -0.40, -9.04, -3.03, -3.93, -4.00, -4.47], 'y_axis': [8.75, 10.13, 4.56, 4.11, 0.83, -0.04, 6.20, 7.69, 7.75, 6.79], 'z_axis': [5.23, 1.15, 5.74, 7.03, -8.29, 0.55, 7.16, 3.82, 1.01, 4.12] }) # 按日期和aid分组计算均值(单条数据时均值即原数据) grouped_data = data3.groupby(['date', 'aid'])[['x_axis', 'y_axis', 'z_axis']].mean().reset_index() # 构建目标结构的列表 result_list = [] for date_val, group in grouped_data.groupby('date'): date_item = {'date': date_val} for _, row in group.iterrows(): # 将aid转换为整数字符串,去掉.0后缀 aid_key = str(int(row['aid'])) date_item[aid_key] = { 'mean': { 'x_axis': round(row['x_axis'], 2), 'y_axis': round(row['y_axis'], 2), 'z_axis': round(row['z_axis'], 2) } } result_list.append(date_item) # 转换为带缩进的JSON字符串 final_json = json.dumps(result_list, indent=2) print(final_json)
代码说明
- 分组计算均值:使用
groupby(['date', 'aid']).mean(),既符合预期中的mean字段逻辑,也能处理同一日期同一aid有多条数据的场景 - 处理aid格式:将浮点数类型的aid转为整数再转字符串,避免出现
.0后缀 - 构造目标结构:遍历每个日期的分组,生成包含
date字段和各aid对应mean结构的字典,最终组成数组,匹配预期的JSON格式 - 保留小数精度:用
round函数保留两位小数,与预期格式一致
内容的提问来源于stack exchange,提问作者salmanmehbub
相关产品推荐
相关产品推荐

