如何将Pandas DataFrame转换为指定嵌套JSON格式?
问题描述
我有如下结构的Pandas DataFrame:
| Group | Input Name | Input Country | multiplier | TargetName | TargetCountry |
|---|---|---|---|---|---|
| v1 | AFP | UK | 1.0 | FSS | France |
| v1 | AFP | UK | 1.0 | BAGE | Spain |
| v1 | IUM | USA | 1.0 | FSS | France |
| v1 | IUM | USA | 1.0 | BAGE | Spain |
| v1 | AFP | UK | 1.0 | CS | France |
| v1 | IUM | USA | 1.0 | CS | France |
| v1 | TION | Ireland | 1.0 | INES | Austria |
希望将其转换为如下JSON格式:
[ { "Group": "v1", "Input": { "InputName": ["AFP", "IUM"], "InputCountry": ["UK", "USA"], "multiplier": 1 }, "Target": { "France": ["FSS", "CS"], "Spain": "BAGE" } }, { "Group": "v1", "Input": { "InputName": "TION", "InputCountry": "Ireland", "multiplier": null }, "Target": { "Austria": "INES" } } ]
我在应用groupby以及添加Input、Target层级时遇到困难,参考过相关帖子但没得到预期结果,求解决方法。
解决方案
核心思路是先按输入组聚合(把共享相同Target集合的Input归为一组),再对每组分别处理Input和Target的结构,最后整理成目标JSON格式。
步骤1:准备数据并定义分组键
首先读取数据,然后为每个Input生成对应的Target组合字符串,以此作为分组依据,确保共享相同Target集合的Input被归为一组:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame([ ["v1", "AFP", "UK", 1.0, "FSS", "France"], ["v1", "AFP", "UK", 1.0, "BAGE", "Spain"], ["v1", "IUM", "USA", 1.0, "FSS", "France"], ["v1", "IUM", "USA", 1.0, "BAGE", "Spain"], ["v1", "AFP", "UK", 1.0, "CS", "France"], ["v1", "IUM", "USA", 1.0, "CS", "France"], ["v1", "TION", "Ireland", 1.0, "INES", "Austria"] ], columns=["Group", "Input Name", "Input Country", "multiplier", "TargetName", "TargetCountry"]) # 生成分组键:每个Input对应的所有Target的排序组合 df["target_key"] = df.groupby(["Input Name", "Input Country"]).apply( lambda x: tuple(sorted(zip(x["TargetName"], x["TargetCountry"]))) ).reset_index(level=[0,1], drop=True)
步骤2:按分组键聚合并构造目标结构
遍历每个分组,分别处理Input和Target部分,根据元素数量决定用列表还是单个值:
result = [] # 按Group和target_key分组 for (group_name, _), group_df in df.groupby(["Group", "target_key"]): # 处理Input模块 input_names = group_df["Input Name"].unique().tolist() input_countries = group_df["Input Country"].unique().tolist() # 按照示例规则:多Input时取multiplier为1,单Input时设为None multiplier = group_df["multiplier"].iloc[0] if len(input_names) > 1 else None # 处理Target模块 target_dict = {} for country, names in group_df.groupby("TargetCountry")["TargetName"]: unique_names = names.unique().tolist() target_dict[country] = unique_names if len(unique_names) > 1 else unique_names[0] # 组装成目标字典 result.append({ "Group": group_name, "Input": { "InputName": input_names if len(input_names) > 1 else input_names[0], "InputCountry": input_countries if len(input_countries) > 1 else input_countries[0], "multiplier": multiplier }, "Target": target_dict })
步骤3:转换为JSON格式
使用json模块将结果转为格式化的JSON字符串:
import json print(json.dumps(result, indent=2))
运行后即可得到符合要求的JSON输出。
关键说明
- 分组键的生成是核心:通过每个Input对应的Target组合区分输入组,确保逻辑匹配需求。
- Input/Target的格式处理:根据元素数量自动切换列表或单个值,完全匹配示例格式。
- 如果
multiplier的取值规则有变化,只需修改对应赋值逻辑即可。
内容的提问来源于stack exchange,提问作者user13957727
相关产品推荐
相关产品推荐

