0

0

在Python中合并并可视化多个groupby聚合条形图

碧海醫心

碧海醫心

发布时间:2025-10-05 08:38:15

|

796人浏览过

|

来源于php中文网

原创

在Python中合并并可视化多个groupby聚合条形图

本文详细介绍了如何使用Pandas和Matplotlib将两个基于相同分组但聚合方式不同的数据集(例如,平均值和总和)合并,并在一个条形图中进行并排可视化。通过数据框合并、Matplotlib的子图功能以及精细的轴标签设置,用户可以清晰地对比不同聚合结果,提升数据分析报告的可读性和专业性。

在数据分析工作中,我们经常需要对数据进行分组聚合,并对不同聚合结果进行比较。例如,我们可能需要同时查看某个类别下数据的平均值和总和。虽然pandas的groupby().agg().plot.barh()可以方便地生成单个聚合的条形图,但要将两个或更多聚合结果并排展示在一个图中,则需要更灵活的方法。本教程将指导您如何通过数据合并和matplotlib的强大功能实现这一目标。

问题场景

假设我们有一个名为day_df的数据集,其中包含年份(yr)、季节(season)和天气情况(weathersit)等分类变量,以及一个数值变量cnt(计数)。我们希望同时可视化按这三个分类变量分组后的cnt的平均值和总和。

直接尝试将两个groupby().agg().plot.barh()的结果合并到一个图中通常会失败,因为它们生成的是独立的图表。此外,如果尝试手动使用plt.bar()或plt.barh(),可能会遇到索引对齐和标签设置的挑战,尤其是在处理多层索引时。

解决方案核心思路

解决此问题的关键在于:

  1. 独立聚合数据: 分别计算每个分组的平均值和总和。
  2. 合并聚合结果: 将这些独立的聚合结果合并到一个Pandas DataFrame中。
  3. 使用Matplotlib绘制: 利用Matplotlib的barh()(或bar())函数在同一个坐标轴上绘制合并后的数据,并通过调整条形的位置和宽度实现并排显示。

详细步骤与代码示例

1. 准备数据并进行分组聚合

首先,我们需要对原始数据进行两次分组聚合,一次计算cnt的平均值,另一次计算cnt的总和。为了方便后续合并,聚合后需要使用reset_index()将多层索引转换为普通列。

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

爱图谱社会化视觉购物系统
爱图谱社会化视觉购物系统

爱图谱是一款社会化视觉购物分享系统,基于PHP,Mysql开发,MVC架构,并承诺将永久免费开源! 产品特点流行时尚的瀑布流设计,新颖的页面展示形式轻量级社交关系,支持主要社交操作整合了多个社交账号,支持多账号绑定支持批量发布商品,无须手工抓取页面即可完成淘宝客商品导入整合UCenter,支持Discuz,ECShop等系统统一登录基于PHP+Mysql开发,产品免费、开源,方便站长二次开发与定制

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

# 假设 day_df 是您的原始数据框
# 为了教程的可运行性,这里创建一个模拟数据框
data = {
    'yr': np.random.choice([0, 1], 100),
    'season': np.random.choice([1, 2, 3, 4], 100),
    'weathersit': np.random.choice([1, 2, 3], 100),
    'cnt': np.random.randint(100, 1000, 100)
}
day_df = pd.DataFrame(data)

# 计算每个分组的平均值并重置索引
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("平均值数据框(部分):")
print(day_mean_dataframe.head())
print("\n总和数据框(部分):")
print(day_sum_dataframe.head())

2. 合并聚合后的数据框

接下来,我们将这两个聚合后的数据框合并。由于它们共享相同的分组键(yr, season, weathersit),我们可以使用pd.merge()函数进行内连接。为了区分聚合结果,我们使用suffixes参数为cnt列添加后缀。

# 合并两个数据框
merged_df = pd.merge(day_mean_dataframe, day_sum_dataframe, 
                     on=["yr", "season", "weathersit"], 
                     suffixes=('_mean', '_sum'))

print("\n合并后的数据框(部分):")
print(merged_df.head())

merged_df现在包含每个分组的cnt_mean和cnt_sum两列,方便我们进行统一绘图。

3. 使用Matplotlib绘制并排条形图

现在,我们可以使用Matplotlib的barh()函数来绘制水平并排条形图。

# 创建图和子图对象
fig, ax = plt.subplots(figsize=(12, 8)) # 调整图大小以适应更多标签

# 为每个分组创建一个位置数组
r1 = np.arange(len(merged_df))
height1 = 0.4 # 设置条形的高度,用于 barh

# 绘制平均值条形
ax.barh(r1, merged_df["cnt_mean"], height=height1, label='平均值 (Mean)', color='skyblue')

# 绘制总和条形,将其位置偏移,实现并排效果
ax.barh(r1 + height1, merged_df["cnt_sum"], height=height1, label='总和 (Sum)', color='lightcoral')

# 设置Y轴刻度标签
# 将刻度放在两个条形之间
ax.set_yticks(r1 + height1 / 2) 
# 生成可读性强的Y轴标签,结合所有分组键
ax.set_yticklabels([f'年份: {row.yr}, 季节: {row.season}, 天气: {row.weathersit}' 
                    for _, row in merged_df.iterrows()])

# 添加图例、轴标签和标题
ax.set_xlabel('计数 (Count)')
ax.set_ylabel('分组类别 (Group Categories)')
ax.set_title('不同分组下计数平均值与总和的对比')
ax.legend()

# 调整布局,防止标签重叠
plt.tight_layout()
plt.show()

代码说明与注意事项

  • reset_index()的重要性: 在groupby().agg()之后调用reset_index()是关键一步。它将多层索引转换为普通列,使得后续的pd.merge()操作更加直接,并且在设置yticklabels时也能方便地访问各个分组键。
  • pd.merge()的suffixes参数: 使用suffixes=('_mean', '_sum')可以避免合并后出现同名列冲突,并清晰地标识出每个聚合结果的来源。
  • np.arange(len(merged_df)): 这创建了一个等差数列,作为每个分组在Y轴上的基准位置。
  • height1和位置偏移: height1定义了每个水平条形的高度。通过将第二个条形的位置设置为r1 + height1,可以使其紧邻第一个条形并排显示。如果使用plt.bar()绘制垂直条形图,则需要调整width和x轴位置。
  • ax.set_yticks()和ax.set_yticklabels(): 对于水平条形图,Y轴代表分组类别。我们需要手动设置Y轴的刻度位置(r1 + height1 / 2将刻度标签置于两个条形之间)和刻度标签。通过遍历merged_df并格式化字符串,可以创建包含所有分组信息的清晰标签。
  • plt.tight_layout(): 这个函数会自动调整子图参数,以给定的填充方式,使之适应图的布局,通常用于防止标签或标题重叠。
  • 可读性: 选择合适的figsize、height(或width)、颜色和字体大小,可以显著提升图表的可读性。对于分组类别较多的情况,水平条形图(barh)通常比垂直条形图(bar)更适合显示长标签。

总结

通过上述步骤,我们成功地将两个基于相同分组但聚合方式不同的数据集(平均值和总和)合并,并在一个清晰的水平条形图中进行了并排可视化。这种方法不仅解决了直接绘制的难题,还提供了高度的灵活性和定制性,使您能够创建专业且易于理解的数据分析图表。掌握这种技术,对于进行多维度数据比较和报告展示非常有价值。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

716

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

626

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

739

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1236

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

699

2023.08.11

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

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

精品课程

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

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

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

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