如何将Pandas DataFrame转换为API请求所需的JSON格式字典?
解决方案
首先要指出:你给出的期望输出存在一个字典键重复的问题——比如Japan的条目里重复了两次groups键,这在Python字典中是不合法的,重复的键会被覆盖。正确的结构应该是把同层级的子项放在同一个groups数组中,修正后的目标格式如下:
{"groups": [ { "name": "Japan", "groups": [ {"name": "Flowers", "ids": [0]}, {"name": "Sushi", "ids": [2]} ] }, { "name": "United States", "groups": [ { "name": "Guns", "groups": [ {"name": "yes", "ids": [1]} ] } ] }, { "name": "South Korea", "groups": [ {"name": "Sunscreen", "ids": [3]} ] } ] }
以下是实现该转换的代码:
import pandas as pd import json my_list = [ ['Japan', 'Flowers'], ['United States', 'Guns', 'yes'], ['Japan', 'Sushi'], ['South Korea', 'Sunscreen'] ] df = pd.DataFrame(my_list, columns=["country", "sector", "flag"]) def build_nested_structure(df): root = {"groups": []} # 遍历每行,行号作为id for idx, row in df.iterrows(): # 提取当前行的非空值作为层级路径 path = [val for val in row if pd.notna(val)] current_level = root["groups"] # 处理路径中的每个中间节点(除最后一个) for name in path[:-1]: # 检查当前层级是否已存在该节点 existing_node = next((item for item in current_level if item["name"] == name), None) if not existing_node: # 不存在则创建新节点 existing_node = {"name": name, "groups": []} current_level.append(existing_node) # 进入下一层级 current_level = existing_node["groups"] # 处理最后一个节点,添加ids last_name = path[-1] existing_last = next((item for item in current_level if item["name"] == last_name), None) if existing_last: existing_last["ids"].append(idx) else: current_level.append({"name": last_name, "ids": [idx]}) return root # 生成并格式化输出结果 result = build_nested_structure(df) print(json.dumps(result, indent=4))
代码说明
- 遍历DataFrame的每一行,将行号
idx作为ids字段的值。 - 提取每行的非空值,组成层级路径(比如美国那行的路径是
["United States", "Guns", "yes"])。 - 从根层级开始逐层检查节点:不存在则创建新节点,存在则进入该节点的子层级继续处理。
- 对路径的最后一个节点,添加
ids字段;若节点已存在,则追加行号,否则创建新节点并初始化ids。
运行代码后即可得到符合要求的嵌套字典结构,直接用于API请求。
内容的提问来源于stack exchange,提问作者Riga
相关产品推荐
相关产品推荐

