如何将Pandas DataFrame按endpoint_id分组转换为指定JSON格式?
问题描述
我有如下DataFrame:
endpoint_id key value name id category_id category_name 0 60 host xx.xx.xx SP 16 5 Database 1 60 username dbc SP 16 5 Database 2 60 password dbc SP 16 5 Database 3 61 username abcd SP_S3 17 6 Storage 4 61 password wxyz SP_S3 17 6 Storage
尝试使用to_dict('orient=records')方法后,得到单条记录独立的JSON结构,但我需要按endpoint_id分组的JSON格式,目标结构如下(修正了原示例中不符合JSON规范的details格式):
[ { "endpoint_id": 60, "name": "SP", "id": 16, "category_id": 5, "category_name": "Database", "details": [ {"key": "host", "value": "xx.xx.xx"}, {"key": "username", "value": "dbc"}, {"key": "password", "value": "dbc"} ] }, { "endpoint_id": 61, "name": "SP_S3", "id": 17, "category_id": 6, "category_name": "Storage", "details": [ {"key": "username", "value": "abcd"}, {"key": "password", "value": "wxyz"} ] } ]
解决方案
可以通过groupby分组后自定义聚合逻辑实现,代码如下:
import pandas as pd import json # 构造示例DataFrame(如果已有数据可跳过此步) df = pd.DataFrame({ 'endpoint_id': [60, 60, 60, 61, 61], 'key': ['host', 'username', 'password', 'username', 'password'], 'value': ['xx.xx.xx', 'dbc', 'dbc', 'abcd', 'wxyz'], 'name': ['SP', 'SP', 'SP', 'SP_S3', 'SP_S3'], 'id': [16, 16, 16, 17, 17], 'category_id': [5, 5, 5, 6, 6], 'category_name': ['Database', 'Database', 'Database', 'Storage', 'Storage'] }) def process_group(group): # 提取同组内一致的公共字段 base_info = group[['endpoint_id', 'name', 'id', 'category_id', 'category_name']].iloc[0].to_dict() # 将key-value转换为details列表 base_info['details'] = group[['key', 'value']].to_dict('records') return base_info # 分组处理并转换为列表 result_list = df.groupby('endpoint_id').apply(process_group).tolist() # 转换为格式化的JSON字符串 final_json = json.dumps(result_list, indent=2) print(final_json)
代码说明
- 分组逻辑:按
endpoint_id分组,同组内的name、id等字段值一致,直接取第一行数据即可。 - 生成details:将每组的
key和value列转换为字典列表,作为details字段的值。 - 结果整合:将公共信息和details合并后,转成列表再序列化JSON。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

