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

如何将DataFrame转换为Region-Country层级的嵌套字典并保留全量数据?

问题:将DataFrame转换为指定嵌套字典结构

需要把包含Name、Firstname、Age、Region、Country字段的DataFrame,转换为外层以Region为键,内层以Country为键,对应值为该国家下(Name, Firstname, Age)元组列表的嵌套字典,预期结构如下:

{
    'EUROPE': {
        'FRANCE': [('DUPONT', 'Jean', '33'), ('PEPIN', 'Jacques', '42')],
        'ALLEMAGNE': [('MARTIN', 'Eric', '32')]
    },
    'ASIA': {
        'CHINA': [('SCHUMACHER', 'Philippe', '35')]
    }
}

尝试了以下代码:

df_dic = dict([(i, [(x, [y, z])]) for i, x, y, z in zip(df['Region'], df['Country'], df['Name'], df['Firstname'], df['Age'])])

但执行后丢失2行数据,且Country未作为内层字典的键,返回结果不符合预期:

{
    'EUROPE': [('ALLEMAGNE': ['MARTIN', 'Eric', '32'])],
    'ASIA': [('CHINA': ['SCHUMACHER', 'Philippe', '35'])]
}

请问如何实现符合预期的转换?


解决方案

方法一:利用pandas分层分组聚合(高效简洁)

通过两次分组(先Region再Country),对每组数据生成目标元组列表,最后转换为嵌套字典:

# 按Region、Country分组,将每组的Name/Firstname/Age转为元组列表
grouped = df.groupby(['Region', 'Country']).apply(
    lambda g: list(zip(g['Name'], g['Firstname'], g['Age']))
).unstack()

# 转换为目标嵌套字典
result = {region: grouped[region].dropna().to_dict() for region in grouped.index}

方法二:手动循环构建字典(直观可控)

遍历DataFrame每一行,逐步填充嵌套字典的层级结构:

result = {}
for _, row in df.iterrows():
    region = row['Region']
    country = row['Country']
    person_tuple = (row['Name'], row['Firstname'], row['Age'])
    
    # 初始化外层Region键
    if region not in result:
        result[region] = {}
    # 初始化内层Country对应的列表
    if country not in result[region]:
        result[region][country] = []
    # 将元组添加到对应列表
    result[region][country].append(person_tuple)

原代码出错原因

  • 字典推导式中,同一个Region会被多次赋值,后遍历的行会覆盖之前的,导致数据丢失;
  • 没有构建内层字典结构,错误地把Country和元组放进了列表,完全不符合目标格式。

内容的提问来源于stack exchange,提问作者Odissine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:12:52