0

0

从Pandas DataFrame创建嵌套字典的实用指南

DDD

DDD

发布时间:2025-10-18 14:30:02

|

802人浏览过

|

来源于php中文网

原创

从Pandas DataFrame创建嵌套字典的实用指南

本文详细介绍了如何将pandas dataframe中的扁平化数据转换为多层嵌套字典结构。通过利用`pandas.dataframe.pivot`方法,您可以高效地将表格数据重塑为以指定列作为外层和内层键,以另一列作为值的字典。教程将涵盖具体实现步骤、示例代码,并提供关键注意事项,帮助您在数据处理中实现更灵活的数据访问和管理。

在数据分析和处理中,我们经常需要将表格形式的数据(如Pandas DataFrame)转换为更具层次感的结构,例如嵌套字典。这种转换对于通过多级键快速查找特定值非常有用。本文将演示如何利用Pandas库的强大功能,将一个包含团队、指标类型和百分比的扁平DataFrame转换为一个以团队名为第一层键、指标类型为第二层键、百分比为最终值的嵌套字典。

原始数据结构与目标

假设我们有一个Pandas DataFrame,其结构如下:

Team X or Y Percentage
A X 80%
A Y 20%
B X 70%
B Y 30%
C X 60%
C Y 40%

我们希望将其转换为以下形式的嵌套字典:

{'A': {'X': '80%', 'Y': '20%'},
 'B': {'X': '70%', 'Y': '30%'},
 'C': {'X': '60%', 'Y': '40%'}}

这种结构允许我们通过 dictionary['Team']['X or Y'] 的方式直接获取相应的百分比。

挑战与常见误区

初学者在尝试创建此类嵌套字典时,可能会尝试使用 dict(zip(list1, dict(zip(list2, list3)))) 这样的方法。然而,这种方法通常会失败,因为Python字典的键必须是唯一的。在我们的例子中,如果直接将 X or Y 列作为键创建内层字典,或者将 Team 列作为键创建外层字典,当这些列中的值在不同的行中重复时,后续的同名键会覆盖之前的键,导致数据丢失。例如,'X' 和 'Y' 在多个团队中都存在,直接 zip 无法正确处理这种多对多的关系。

解决方案:使用 pandas.DataFrame.pivot

Pandas提供了一个名为 pivot 的强大方法,专门用于重塑DataFrame。它可以将指定列的值转换为新的列名,从而实现数据的透视。结合 to_dict() 方法,我们可以优雅地解决这个问题。

1. 创建示例DataFrame

首先,让我们创建上述的DataFrame:

import pandas as pd

data = {
    'Team': ['A', 'A', 'B', 'B', 'C', 'C'],
    'X or Y': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'Percentage': ['80%', '20%', '70%', '30%', '60%', '40%']
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)

输出:

原始DataFrame:
  Team X or Y Percentage
0    A      X        80%
1    A      Y        20%
2    B      X        70%
3    B      Y        30%
4    C      X        60%
5    C      Y        40%

2. 应用 pivot 方法

pivot 方法接受三个主要参数:

剪映
剪映

一款全能易用的桌面端剪辑软件

下载
  • index: 用于生成新的DataFrame的行索引的列名。
  • columns: 用于生成新的DataFrame的列索引的列名。
  • values: 用于填充新的DataFrame的值的列名。

在我们的场景中:

  • 我们希望最终字典的第一层键是 Team,因此 Team 将作为 columns 参数。
  • 我们希望最终字典的第二层键是 X or Y,因此 X or Y 将作为 index 参数。
  • 我们希望最终字典的值是 Percentage,因此 Percentage 将作为 values 参数。
# 使用pivot重塑DataFrame
pivot_df = df.pivot(index='X or Y', columns='Team', values='Percentage')
print("\n重塑后的DataFrame (pivot结果):")
print(pivot_df)

输出:

重塑后的DataFrame (pivot结果):
Team     A    B    C
X or Y
X      80%  70%  60%
Y      20%  30%  40%

请注意,pivot 的默认行为是将 columns 参数指定的列作为新DataFrame的列,index 参数指定的列作为新DataFrame的行。

3. 转换为嵌套字典

重塑后的 pivot_df 已经非常接近我们想要的结构。现在,我们只需要调用其 to_dict() 方法即可。to_dict() 方法默认会将DataFrame转换为以列名为外层键,行索引为内层键的嵌套字典。

# 将重塑后的DataFrame转换为嵌套字典
nested_dict = pivot_df.to_dict()
print("\n最终生成的嵌套字典:")
print(nested_dict)

输出:

最终生成的嵌套字典:
{'A': {'X': '80%', 'Y': '20%'}, 'B': {'X': '70%', 'Y': '30%'}, 'C': {'X': '60%', 'Y': '40%'}}

这正是我们期望的输出结果。

注意事项

  1. 唯一性要求: pivot 方法要求 index 和 columns 参数组合出的每个单元格必须是唯一的。如果存在相同的 index 和 columns 组合,例如同一个 Team 有多行相同的 X or Y 值,pivot 会抛出 ValueError: Index contains duplicate entries, cannot reshape 错误。
  2. pivot_table 的使用: 如果你的数据中存在重复的 index 和 columns 组合,并且你需要对这些重复值进行聚合(如求和、平均值等),那么应该使用 pandas.DataFrame.pivot_table 方法。pivot_table 提供了 aggfunc 参数来指定聚合函数
    # 示例:如果数据有重复,需要聚合
    # df_with_duplicates.pivot_table(index='X or Y', columns='Team', values='Percentage', aggfunc='first').to_dict()
  3. 数据类型: 在本例中,Percentage 列的值是字符串(如 '80%')。如果它们是数值类型(如 0.80),pivot 同样适用,并且在转换为字典后,值会保持其数值类型。根据需要,你可能需要在数据加载或转换前进行类型转换。
  4. NaN值: 如果在 pivot 过程中,某个 index 和 columns 的组合没有对应的值,结果DataFrame中会填充 NaN。to_dict() 转换后,这些 NaN 值也会保留在字典中,可能需要进一步处理(如过滤掉 NaN 或替换为默认值)。

总结

通过 pandas.DataFrame.pivot 结合 to_dict() 方法,我们可以高效、准确地将扁平化的表格数据转换为层次清晰的嵌套字典。这种方法不仅代码简洁,而且能够优雅地处理多级键的映射关系,是Pandas数据处理中一项非常实用的技巧。理解 pivot 的工作原理及其与 pivot_table 的区别,将有助于你在更复杂的数据重塑场景中游刃有余。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

69

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

655

2024.03.22

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号