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

如何将Pandas DataFrame转换为指定嵌套JSON格式?

问题描述

我有如下结构的Pandas DataFrame:

GroupInput NameInput CountrymultiplierTargetNameTargetCountry
v1AFPUK1.0FSSFrance
v1AFPUK1.0BAGESpain
v1IUMUSA1.0FSSFrance
v1IUMUSA1.0BAGESpain
v1AFPUK1.0CSFrance
v1IUMUSA1.0CSFrance
v1TIONIreland1.0INESAustria

希望将其转换为如下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:23:18