合并Pandas groupby聚合结果并进行分组条形图可视化

合并Pandas groupby聚合结果并进行分组条形图可视化

本教程详细介绍了如何将Pandas groupby操作生成的不同聚合结果(如平均值和总和)合并到同一张图表中进行可视化。通过先将聚合后的数据框合并,然后利用Matplotlib的bar或barh函数,可以实现对复杂分组数据的多指标对比分析,有效解决直接链式调用绘图函数无法实现分组对比的问题。

在数据分析过程中,我们经常需要对数据集进行分组聚合,并对比同一分组下不同聚合指标的表现。例如,我们可能需要同时比较某个类别群体的平均值和总和。虽然pandas提供了便捷的groupby().plot.barh()方法,但它通常用于绘制单个聚合指标的图表。当我们需要在同一图表中并排展示多个聚合指标时,就需要更灵活的绘图策略。

挑战:直接绘制多个聚合结果

考虑以下两种独立的聚合操作,它们分别计算了不同维度组合下的cnt(计数)的平均值和总和:

import pandas as pdimport matplotlib.pyplot as pltimport numpy as np# 假设 day_df 是您的原始DataFrame,包含 'yr', 'season', 'weathersit', 'cnt' 等列# 为了示例,我们创建一个模拟的 day_dfdata = {    '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, 110, 160, 210, 260, 310, 360, 410, 460]}day_df = pd.DataFrame(data)# 单独的聚合和绘图尝试# day_df.groupby(by=["yr", "season", "weathersit"]).agg({"cnt": "sum"}).plot.barh()# day_df.groupby(by=["yr", "season", "weathersit"]).agg({"cnt": "mean"}).plot.barh()

直接对这两个聚合结果分别调用.plot.barh()会生成两张独立的图表,无法进行直观的并排比较。尝试手动使用plt.bar函数,但如果数据准备不当,例如直接从多级索引的DataFrame中提取列,会导致索引错位或数据无法匹配的问题。

解决方案:合并聚合数据框并使用Matplotlib绘图

解决此问题的核心在于:首先将不同聚合指标的数据整合到一个统一的DataFrame中,然后利用Matplotlib的灵活性来绘制分组条形图。

1. 数据准备:聚合与合并

首先,我们需要对原始数据进行两次聚合,分别计算所需的指标(例如,总和和平均值),并将结果转换为普通的DataFrame,以便后续合并。reset_index()在此步骤中至关重要,它将多级索引转换为普通列,使得数据框可以基于这些列进行合并。

# 计算平均值并重置索引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()# 合并数据框# 使用 `on` 参数指定合并键,`suffixes` 参数处理同名列的后缀merged_df = pd.merge(day_mean_dataframe, day_sum_dataframe, on=["yr", "season", "weathersit"], suffixes=('_mean', '_sum'))print("合并后的数据框 (merged_df):")print(merged_df)

merged_df现在包含了每个分组的平均值(cnt_mean)和总和(cnt_sum),为后续的统一绘图奠定了基础。

2. 绘制分组条形图(垂直方向)

使用Matplotlib的plt.subplots创建图表和坐标轴对象,然后利用ax.bar函数绘制分组条形图。关键在于为不同指标的条形图设置不同的x轴位置偏移量,使其并排显示。

# 创建图表和坐标轴对象fig, ax = plt.subplots(figsize=(14, 7)) # 调整图表大小以适应更多标签# 计算每个分组的条形图的基准位置r1 = np.arange(len(merged_df))width = 0.35 # 条形图的宽度# 绘制平均值条形图ax.bar(r1 - width/2, merged_df["cnt_mean"], width=width, label='平均值', color='skyblue')# 绘制总和条形图,并向右偏移ax.bar(r1 + width/2, merged_df["cnt_sum"], width=width, label='总和', color='lightcoral')# 设置x轴刻度标签# 将多级分组键组合成一个字符串作为标签ax.set_xticks(r1)ax.set_xticklabels([f'年:{row.yr}, 季:{row.season}, 天气:{row.weathersit}' for _, row in merged_df.iterrows()], rotation=45, ha='right')# 添加图例和标题ax.legend()ax.set_xlabel('分组')ax.set_ylabel('计数')ax.set_title('各分组计数平均值与总和对比 (垂直条形图)')plt.tight_layout() # 调整布局以避免标签重叠plt.show()

3. 绘制分组条形图(水平方向)

对于分组标签较长或分组数量较多的情况,水平条形图(ax.barh)通常能提供更好的可读性。其原理与垂直条形图类似,只是交换了x轴和y轴的角色。

# 创建图表和坐标轴对象fig, ax = plt.subplots(figsize=(14, 8)) # 调整图表大小# 计算每个分组的条形图的基准位置r1 = np.arange(len(merged_df))height = 0.35 # 条形图的高度# 绘制平均值条形图ax.barh(r1 - height/2, merged_df["cnt_mean"], height=height, label='平均值', color='skyblue')# 绘制总和条形图,并向上偏移ax.barh(r1 + height/2, merged_df["cnt_sum"], height=height, label='总和', color='lightcoral')# 设置y轴刻度标签ax.set_yticks(r1)ax.set_yticklabels([f'年:{row.yr}, 季:{row.season}, 天气:{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().agg()之后,结果通常是一个多级索引的Series或DataFrame。reset_index()将其转换为普通的DataFrame,并将索引级别转换为常规列,这对于后续的pd.merge()操作至关重要。suffixes 参数:在pd.merge()中,如果两个DataFrame有同名的非合并列,suffixes参数可以为这些列添加不同的后缀,避免列名冲突,例如cnt_mean和cnt_sum。标签处理:当分组键包含多个维度时,如yr, season, weathersit,需要手动将它们组合成一个有意义的字符串作为刻度标签,以提高可读性。rotation和ha(horizontal alignment)参数可以帮助调整长标签的显示。图表尺寸与布局:使用figsize调整图表大小,特别是当分组数量较多或标签较长时。plt.tight_layout()可以自动调整子图参数,使之填充整个图表区域,避免标签重叠。颜色和图例:合理使用颜色区分不同的指标,并添加清晰的图例,有助于读者理解图表内容。选择条形图方向垂直条形图 (ax.bar) 适用于分组数量较少、分组标签较短的情况。水平条形图 (ax.barh) 适用于分组数量较多、分组标签较长的情况,可以有效避免标签重叠,提高可读性。

总结

通过将Pandas的groupby聚合结果与pd.merge相结合,我们能够有效地整合来自不同聚合操作的数据。随后,利用Matplotlib提供的强大绘图功能,我们可以灵活地创建分组条形图,无论是垂直还是水平方向,都能清晰地展示多指标在同一分组下的对比情况。这种方法不仅解决了直接链式绘图的局限性,也为更复杂的数据可视化提供了坚实的基础。

以上就是合并Pandas groupby聚合结果并进行分组条形图可视化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1375755.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
优化Python矩阵运算:提升与Matlab媲美的性能
上一篇 2025年12月14日 15:17:55
Python列表推导式中的外部变量修改限制与高效计数方法
下一篇 2025年12月14日 15:18:10

相关推荐

  • 如何使用Webman框架实现数据可视化和报表生成功能?

    如何使用webman框架实现数据可视化和报表生成功能? 随着大数据和互联网的迅猛发展,数据可视化和报表生成已经成为许多企业和个人的需求。Webman框架是一个开源的Python Web开发框架,它提供了快速构建Web应用程序的功能和丰富的视图库。在本篇文章中,我将介绍如何使用Webman框架实现数据…

    用户投稿 2026年9月5日
    000
  • 如何使用Webman框架实现数据可视化和图表展示功能?

    如何使用webman框架实现数据可视化和图表展示功能? Webman是一个轻量级的Python Web框架,它提供了灵活且易于使用的工具,帮助开发者快速构建Web应用。在数据处理和可视化领域,Webman框架有很多功能可以帮助我们实现数据可视化和图表展示的需求。本文将介绍如何使用Webman框架来实…

    用户投稿 2026年9月5日
    000
  • 灵活配置TYPO3:SourceBroker/configs 的妙用

    在维护多个 typo3 实例时,常常面临一个难题:每个实例的数据库连接、缓存设置、图片处理路径等配置都可能不同。如果直接在代码中硬编码这些配置,不仅难以维护,而且容易出错。更糟糕的是,每次部署都需要修改代码,这无疑增加了工作量和出错的风险。 为了解决这个问题,我尝试过多种方法,例如使用不同的配置文件…

    用户投稿 2026年9月4日
    100
  • 如何利用WebMan技术进行数据可视化分析

    如何利用WebMan技术进行数据可视化分析 数据可视化是当今数据分析和决策制定中不可或缺的一部分。通过图表、图形和可视化工具,可以将数据转化为直观而易于理解的形式,帮助人们更好地理解和利用数据。WebMan技术是一种基于Web的数据可视化工具,它通过结合前端开发技术和数据处理技术,使得数据可视化变得…

    2026年9月4日
    000
  • 灵活的路由配置:RollerworksRouteAutowiringBundle 的实践指南

    在开发一个大型 symfony 应用时,我们通常会将应用拆分成多个模块(bundle)。每个模块都拥有自己的路由配置,传统的做法是将这些路由配置分别定义在各个模块中,然后在主应用的路由配置文件中逐一导入。这种方法存在一些问题: 维护成本高: 随着模块数量的增加,主应用的路由配置文件会变得越来越臃肿,…

    用户投稿 2026年9月4日
    700
  • 怎么用AI做商业PPT_借助CanvaAI快速生成专业幻灯片步骤

    怎么用AI做商业PPT_借助CanvaAI快速生成专业幻灯片步骤怎么用AI做商业PPT_借助CanvaAI快速生成专业幻灯片步骤怎么用AI做商业PPT_借助CanvaAI快速生成专业幻灯片步骤怎么用AI做商业PPT_借助CanvaAI快速生成专业幻灯片步骤

    答案:利用Canva AI制作商业PPT需明确指令、注入品牌元素、填充真实数据与故事、人工精修并规避过度依赖AI等误区,通过人机协作提升效率与专业性。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ AI,尤其是Canva AI,已经彻底改变…

    2026年9月3日 用户投稿
    000
  • 快速构建API:使用zf3belcebur/doctrine-orm-fast-api库的体验分享

    在开发过程中,我们经常需要快速构建一个api来处理crud操作,尤其是在使用doctrine orm时。传统的方法需要手动编写大量的控制器和路由代码,这不仅耗时,而且容易出错。最近,我在项目中遇到了同样的问题,经过一番探索,我发现了zf3belcebur/doctrine-orm-fast-api这…

    用户投稿 2026年9月3日
    700
  • 使用 Composer 提升网站 SEO:ahc/twigseobundle 实践指南

    可以通过以下地址学习composer:学习地址 在网站开发中,SEO优化是提升网站在搜索引擎排名的重要手段之一。我最近在处理一个项目时,遇到了一个棘手的问题:如何在Twig模板中高效地管理和生成SEO元素,如标题、描述和关键词等。我尝试了多种方法,但都未能达到理想的效果。直到我发现了ahc/twig…

    用户投稿 2026年9月2日
    200
  • WordPressのパフォーマンス向上:WP Content Frameworkのキャッシュモジュール

    composerを利用したwordpressのキャッシュ管理:wp content frameworkの導入ガイド 最近、私のWordPressサイトが遅くなる問題に直面しました。特にトラフィックが多い時や複雑なクエリが実行される時、ページの読み込みが遅くなり、ユーザー体験が低下していました。この問…

    用户投稿 2026年9月1日
    000
  • Workerman开发:如何实现基于HTTP协议的实时数据可视化系统

    Workerman是一种高性能的PHP网络通信框架,它能够快速地构建实时通信、消息推送和数据可视化等功能。本文将介绍如何使用Workerman开发一款基于HTTP协议的实时数据可视化系统,并提供具体代码示例。 一、系统设计 本系统采用B/S架构,即浏览器(Browser)和服务器(Server)之间…

    2026年9月1日
    000
  • 如何在NestJS应用中优雅地配置Prisma数据库连接?

    在NestJS应用中灵活配置Prisma数据库连接 本文将演示如何利用@nestjs/config包优雅地配置NestJS应用中的Prisma数据库连接,提升配置的灵活性和可维护性。 首先,确保已安装@nestjs/config和Prisma依赖包。 以下步骤将指导您完成配置: 第一步:创建数据库配…

    2026年8月31日
    100
  • 如何在NestJS应用中使用@nestjs/config优雅地配置Prisma数据库?

    在 nestjs 应用中整合 prisma 和 @nestjs/config 配置数据库 本文将详细介绍如何在 nestjs 应用中利用 @nestjs/config 模块优雅地配置 prisma 数据库连接。这篇文章将围绕如何使用 @nestjs/config 来管理 prisma 数据库配置展开…

    用户投稿 2026年8月31日
    200
  • 如何用AI分析数据_使用ChatGPT进行数据分析与可视化

    如何用AI分析数据_使用ChatGPT进行数据分析与可视化如何用AI分析数据_使用ChatGPT进行数据分析与可视化如何用AI分析数据_使用ChatGPT进行数据分析与可视化如何用AI分析数据_使用ChatGPT进行数据分析与可视化

    答案:使用AI分析数据需将任务转化为自然语言指令,核心步骤包括数据准备、指令设计、结果解读与迭代优化。首先清洗数据并转为CSV/JSON格式,确保字段清晰;其次设计明确具体的指令,分步引导分析,如“计算各产品总销售额并排序”;然后通过人工核对或与其他工具对比验证结果准确性;ChatGPT可生成基础图…

    2026年8月30日 用户投稿
    000
  • SigStyle— 吉大联合 Adobe 等机构推出的风格迁移框架

    sigstyle:一种先进的签名风格迁移框架 SigStyle是由吉林大学、南京大学智能科学与技术学院和Adobe联合研发的创新型签名风格迁移框架。它能够将单张风格图像的独特视觉元素(例如几何结构、色彩搭配和笔触)无缝地迁移到目标图像上。该框架基于个性化文本到图像扩散模型,并利用超网络高效地微调模型…

    2026年8月29日
    100
  • 本地GitLab 连接 本地minikube

    在本地环境中,我启动了一个gitlab实例,并使用docker运行了一个minikube集群,成功地将两者连接起来。为了确保在本地网络中能够正常工作,我在gitlab的管理员设置中进行了网络配置,允许从本地ip地址进行访问。 在设置中,我勾选了“允许来自Web钩子和服务的对本地网络的请求”选项。 在…

    2026年8月27日
    000
  • Qt编写数据可视化大屏界面电子看板4-布局另存

    一、前言 布局另存功能是数据可视化大屏界面电子看板系统中的一项便捷功能,旨在帮助用户在现有布局上进行微调后,直接将其保存为新的配置文件,从而避免从头开始重新构建布局的繁琐过程。此功能依赖于配置文件的保存机制,通过将现有布局另存为不同名称的配置文件,用户可以轻松管理和切换不同的布局设置。在代码实现上,…

    2026年8月26日
    100
  • 如何在PHP应用中解决数据可视化难题,使用szymach/c-pchart轻松生成精美图表

    可以通过一下地址学习composer:学习地址 数据可视化:现代Web应用不可或缺的基石 想象一下,你正在构建一个管理后台,需要向用户展示复杂的业务数据,比如销售趋势、用户增长曲线、资源使用率等等。如果只是简单地罗列数字,用户很难快速理解数据背后的含义。这时,直观、美观的图表就成了连接数据与洞察力的…

    用户投稿 2026年8月25日
    000
  • html5 圆形怎么画_HTML5用border-radius:50%或SVG circle画正圆【绘制】

    HTML5提供三种原生绘制正圆方法:一、CSS border-radius:50%适用于等宽高div;二、SVG circle元素通过cx/cy/r精确定义矢量圆;三、Canvas arc()方法用JavaScript像素级绘制动态圆。 如果您希望在网页中绘制一个完美的正圆形,HTML5 提供了多种…

    2025年12月23日
    000
  • Flexbox中实现首元素左对齐,其余元素右对齐的高效方法

    本教程将深入探讨在flexbox布局中,如何不使用额外包装器,仅通过巧妙运用css的`margin-left: auto`属性,实现将首个元素固定在容器左侧,而将其余所有兄弟元素推向右侧的布局技巧。通过具体代码示例和原理分析,帮助开发者高效解决常见的导航栏或列表元素分离对齐问题。 在构建现代网页布局…

    2025年12月23日
    000
  • 根据文本内容动态设置元素背景色的JavaScript教程

    本教程旨在详细讲解如何使用javascript动态地根据html元素(如`div`标签)的文本内容来改变其背景颜色。文章将通过具体的代码示例,展示如何获取特定类的所有元素、遍历它们,并根据其内部文本值应用不同的样式,最终实现在页面加载时自动执行此功能,从而提升网页的交互性和信息展示能力。 概述 在网…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信