0

0

在Python中合并Pandas Groupby聚合结果并生成组合条形图教程

心靈之曲

心靈之曲

发布时间:2025-10-05 12:42:40

|

661人浏览过

|

来源于php中文网

原创

在Python中合并Pandas Groupby聚合结果并生成组合条形图教程

本教程详细介绍了如何将Pandas中两个基于相同分组键(如年、季节、天气情况)的聚合结果(例如总和与平均值)合并,并使用Matplotlib将它们绘制成一个清晰的组合条形图。文章通过数据合并、子图创建和精细化绘图步骤,指导用户实现高效的数据可视化,避免了直接绘制的常见问题

在数据分析和可视化过程中,我们经常需要对同一数据集进行多种聚合操作,例如计算分组的总和与平均值,并希望将这些结果在一个图表中进行比较。直接尝试将两个独立的 groupby().plot.barh() 调用合并到一个图表中通常会遇到挑战,因为它们生成的是独立的图表实例,并且数据结构可能不兼容。本教程将提供一种结构化的方法来解决这个问题,通过数据预处理和matplotlib的灵活绘图功能,实现组合条形图的创建。

核心思路:数据合并与统一绘图

解决此问题的关键在于:

  1. 独立聚合并规范化数据: 分别执行 groupby() 聚合操作,并将结果转换为标准DataFrame,确保分组键作为可访问的列。
  2. 合并数据: 将两个聚合结果DataFrame基于共同的分组键进行合并,形成一个包含所有聚合指标的统一DataFrame。
  3. 统一绘图: 使用Matplotlib的 plt.subplots() 创建一个图表和坐标轴对象,然后利用合并后的DataFrame在同一个坐标轴上绘制组合条形图。

详细步骤与示例代码

假设我们有一个名为 day_df 的DataFrame,其中包含 yr (年份), season (季节), weathersit (天气情况) 等分组字段,以及 cnt (计数) 字段。我们的目标是可视化不同分组下 cnt 的总和与平均值。

首先,导入必要的库:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 假设 day_df 已经加载并包含数据
# 例如,创建一个模拟数据用于演示
data = {
    'yr': [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1],
    'season': [1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2],
    'weathersit': [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2],
    'cnt': [100, 150, 200, 250, 300, 350, 400, 450, 120, 180, 220, 280, 330, 380, 430, 480]
}
day_df = pd.DataFrame(data)

1. 数据聚合与规范化

分别计算 cnt 的平均值和总和,并使用 reset_index() 将分组键从索引转换为常规列。

立即学习Python免费学习笔记(深入)”;

# 计算每个分组的平均值
day_mean_dataframe = day_df.groupby(by=["yr", "season", "weathersit"]).agg({"cnt": "mean"}).reset_index()

# 计算每个分组的总和
day_sum_dataframe = day_df.groupby(by=["yr", "season", "weathersit"]).agg({"cnt": "sum"}).reset_index()

print("Mean DataFrame Head:")
print(day_mean_dataframe.head())
print("\nSum DataFrame Head:")
print(day_sum_dataframe.head())

reset_index() 是一个关键步骤,它将 groupby 操作后生成的多层索引转换回扁平的DataFrame结构,使得 yr, season, weathersit 成为普通的列,便于后续的合并操作。

Pixso AI
Pixso AI

Pixso AI是一款智能生成设计稿工具,通过AI一键实现文本输入到设计稿生成。

下载

2. 合并数据帧

使用 pd.merge() 函数将两个聚合后的DataFrame合并。合并时,指定 on 参数为共同的分组键,并使用 suffixes 参数为相同列名的聚合结果添加不同的后缀,以避免列名冲突。

merged_df = pd.merge(day_mean_dataframe, day_sum_dataframe, on=["yr", "season", "weathersit"], suffixes=('_mean', '_sum'))

print("\nMerged DataFrame Head:")
print(merged_df.head())

现在,merged_df 包含了每个分组的 cnt_mean 和 cnt_sum,数据已经准备好进行统一绘图。

3. 绘制组合条形图

我们将展示两种常见的组合条形图:垂直条形图和水平条形图。

3.1 绘制垂直组合条形图
# 创建图表和坐标轴对象
fig, ax = plt.subplots(figsize=(14, 7)) # 调整图表大小以适应更多标签

# 确定每个分组条形的位置
r1 = np.arange(len(merged_df)) # 为每个分组创建一个基准位置
width1 = 0.4 # 条形的宽度

# 绘制平均值条形
bars_mean = ax.bar(r1 - width1/2, merged_df["cnt_mean"], width=width1, label='平均值 (Mean)', color='skyblue')
# 绘制总和条形,位置稍微偏移
bars_sum = ax.bar(r1 + width1/2, merged_df["cnt_sum"], width=width1, label='总和 (Sum)', color='lightcoral')

# 设置X轴刻度标签
# 刻度位置应该在两个条形的中间
ax.set_xticks(r1)
# 组合分组键作为X轴标签
ax.set_xticklabels([f'Yr:{row.yr}, Sea:{row.season}, Wea:{row.weathersit}' for _, row in merged_df.iterrows()], rotation=90, ha='right')

# 添加图例、标题和轴标签
ax.legend()
ax.set_xlabel("分组条件 (年, 季节, 天气情况)")
ax.set_ylabel("计数")
ax.set_title("不同分组下计数的平均值与总和 (垂直条形图)")
plt.tight_layout() # 自动调整布局,防止标签重叠
plt.show()
3.2 绘制水平组合条形图

水平条形图在分组标签较长时特别有用,可以避免标签重叠。

# 创建图表和坐标轴对象
fig, ax = plt.subplots(figsize=(14, 8)) # 调整图表大小

# 确定每个分组条形的位置
r1 = np.arange(len(merged_df)) # 为每个分组创建一个基准位置
height1 = 0.4 # 条形的高度 (对于水平条形图)

# 绘制平均值条形
bars_mean_h = ax.barh(r1 - height1/2, merged_df["cnt_mean"], height=height1, label='平均值 (Mean)', color='skyblue')
# 绘制总和条形,位置稍微偏移
bars_sum_h = ax.barh(r1 + height1/2, merged_df["cnt_sum"], height=height1, label='总和 (Sum)', color='lightcoral')

# 设置Y轴刻度标签
# 刻度位置应该在两个条形的中间
ax.set_yticks(r1)
# 组合分组键作为Y轴标签
ax.set_yticklabels([f'Yr:{row.yr}, Sea:{row.season}, Wea:{row.weathersit}' for _, row in merged_df.iterrows()])

# 添加图例、标题和轴标签
ax.legend()
ax.set_xlabel("计数")
ax.set_ylabel("分组条件 (年, 季节, 天气情况)")
ax.set_title("不同分组下计数的平均值与总和 (水平条形图)")
plt.tight_layout() # 自动调整布局
plt.show()

注意事项

  • reset_index() 的重要性: 在 groupby() 之后,聚合列会成为新的索引。使用 reset_index() 可以将这些索引转换为普通列,使得它们可以在 pd.merge() 中作为 on 参数进行合并,并且方便在绘图时作为标签或数据点。
  • pd.merge() 的应用: 这是将不同聚合结果整合到一起的关键步骤。确保 on 参数指定了所有用于分组的列,并且 suffixes 参数用于区分合并后相同名称的聚合列。
  • Matplotlib subplots(): 推荐使用 plt.subplots() 来创建图表 (fig) 和坐标轴 (ax) 对象,这样可以更灵活地控制图表的各个元素。
  • 条形位置计算: 在绘制组合条形图时,需要巧妙地计算每个条形的位置 (r1, r1 + width1 或 r1 - width1/2, r1 + width1/2),确保它们并排显示且中心对齐。
  • 标签与可读性: 当分组标签较长时,尤其是在垂直条形图中,使用 rotation=90 和 ha='right' (或 ha='center') 可以改善标签的可读性。对于水平条形图,通常标签会更清晰。plt.tight_layout() 可以自动调整图表布局,防止标签和标题重叠。
  • 自定义: Matplotlib 提供了丰富的自定义选项,可以调整条形颜色、边框、图例、标题、轴标签等,以使图表更具表现力。

总结

通过将独立的 groupby 聚合结果进行规范化、合并,并利用Matplotlib的 bar() 或 barh() 函数在同一坐标轴上进行绘制,我们可以有效地创建出清晰、专业的组合条形图。这种方法不仅解决了直接合并 plot.barh() 结果的难题,也为更复杂的多指标可视化提供了坚实的基础。掌握这种数据处理和绘图技巧,将大大提升数据分析和报告的效率与质量。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

68

2025.12.04

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

539

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

21

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

28

2026.01.06

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

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

9

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

8

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

3

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新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号