如何将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
相关产品推荐
相关产品推荐

