合并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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 15:17:55
下一篇 2025年12月14日 15:18:10

相关推荐

  • Matplotlib Y轴标签字体大小调整实用指南

    本教程详细介绍了如何在matplotlib图中有效调整y轴标签的字体大小。文章提供了两种主要方法:通过`set_yticklabels`直接设置,以及利用`tick_params`实现更广泛的兼容性。此外,还包含了在tkinter等gui环境中应用时的注意事项和常见故障排除技巧,旨在帮助用户轻松自定…

    2025年12月14日
    000
  • Matplotlib SVG输出中嵌入脚本信息与元数据管理

    本教程详细阐述了如何在matplotlib生成的%ignore_a_1%文件中嵌入元数据,特别是添加创建脚本信息。通过利用`plt.savefig`函数的`metadata`参数,并遵循都柏林核心元数据标准,用户可以轻松地为svg图形文件添加结构化描述,如创建者、标题和日期等,从而提高文件的可追溯性…

    2025年12月14日
    000
  • Matplotlib SVG 文件添加元数据注释:使用 metadata 参数

    Matplotlib 允许用户在保存 SVG 文件时嵌入元数据注释。本文将详细介绍如何利用 plt.savefig 函数的 metadata 参数,遵循 Dublin Core 标准,为 SVG 图形文件添加创建者(Creator)等信息,从而有效记录文件来源和上下文,提升文件可追溯性。 1. 为什…

    2025年12月14日
    000
  • Matplotlib交互式矩形绘制教程:基于鼠标点击

    本教程详细介绍了如何使用matplotlib实现用户交互式矩形绘制功能。通过捕获鼠标点击事件,用户可以在图像或图表上选择两个点来定义矩形,并实时显示。文章分析了常见问题,如坐标状态管理和图形刷新机制,并提供了一个优化后的python代码示例,旨在帮助开发者构建响应式的数据可视化应用。 在数据可视化和…

    2025年12月14日
    000
  • 利用Matplotlib为SVG图表添加创建者元数据教程

    本文将指导您如何在matplotlib生成的svg文件中嵌入自定义元数据,特别是创建者信息。通过利用`plt.savefig`函数的`metadata`参数,并遵循dublin core标准,您可以有效地为svg图表添加可追溯的文档信息,从而提高文件管理和协作的效率。 在数据可视化和报告生成的工作流…

    2025年12月14日
    000
  • Python入门如何绘制基础图表_Python入门数据可视化的第一步

    答案:使用Python绘图库可直观呈现数据趋势与分布。一、Matplotlib绘制折线图需导入pyplot模块,设置中文字体,准备数据后调用plt.plot()并添加标题标签,最后显示图像。二、绘制柱状图时用plt.bar()或plt.barh()展示类别数据差异,添加坐标轴标签并旋转x轴标签防重叠…

    2025年12月14日
    000
  • Python入门如何进行数据处理_Python入门数据分析的简单入门

    掌握Python数据处理需先学习Pandas、NumPy、Matplotlib、Seaborn及数据筛选分组。首先用Pandas读取清洗数据,通过pd.read_csv()加载文件并检查缺失值;接着利用NumPy进行高效数值计算,如均值标准差;再结合Matplotlib基础绘图与Seaborn美化图…

    2025年12月14日
    000
  • Matplotlib Y轴刻度标签字体大小调整教程

    本教程详细介绍了如何在Matplotlib中调整Y轴刻度标签的字体大小,以提高图表的可读性。文章提供了两种主要方法:使用`set_yticklabels()`函数直接设置标签字体,以及利用`tick_params()`函数进行更灵活的参数控制,并考虑了不同Matplotlib版本的兼容性。通过实际代…

    2025年12月14日
    000
  • 利用Pandas和NumPy高效从索引映射生成坐标DataFrame

    本文详细介绍了如何根据一个索引列表,从现有pandas dataframe中高效提取对应的x、y坐标,并构建一个新的dataframe。文章首先探讨了基于循环和字典的初步实现方式及其改进,随后重点展示了利用numpy进行矢量化操作的优化方案,该方案显著提升了数据处理性能,为后续的数据可视化和分析奠定…

    2025年12月14日
    000
  • 从自定义经验累积分布函数(CDF)高效抽样:Numpy与Scipy实践指南

    本文详细介绍了如何从自定义的经验累积分布函数(cdf)中进行数据抽样。我们将利用逆变换抽样原理,结合python的numpy和scipy库,实现两种抽样方法:一是直接基于cdf离散点进行阶梯式插值抽样,二是采用样条等平滑技术对cdf进行插值后抽样,以生成更平滑、更符合实际分布的样本。 理解经验累积分…

    2025年12月14日
    000
  • Matplotlib Y轴标签字体大小调整:实用教程

    本教程详细介绍了在matplotlib中调整y轴标签字体大小的两种主要方法:`set_yticklabels`和`tick_params`。文章通过代码示例演示了如何在绘制图形后设置字体大小,并提供了针对常见问题的故障排除指南,包括检查轴对象方法和matplotlib版本,确保用户能够高效地自定义图…

    2025年12月14日
    000
  • 从自定义经验累积分布函数 (CDF) 进行采样的 Python 技术指南

    本教程详细介绍了如何使用 python 从自定义经验累积分布函数 (cdf) 中高效采样。文章将探讨两种核心方法:一种是直接基于 cdf 离散点进行采样,利用 `numpy.interp` 实现;另一种是通过平滑处理 cdf,例如使用样条插值,借助 `scipy.interpolate.interp…

    2025年12月14日
    000
  • 利用Pandas和NumPy高效构建坐标DataFrame

    本文详细介绍了两种从现有DataFrame和索引列表构建新坐标DataFrame的方法。首先通过迭代字典构建,然后利用Pandas的`from_dict`方法实现。接着,重点阐述了如何运用NumPy的向量化操作,以更简洁、高效的方式直接从原始数据中提取并重构所需的X、Y坐标对。文章旨在提供清晰的教程…

    2025年12月14日
    000
  • Pandas DataFrame 数据筛选:按指定列值进行条件截取

    本文详细介绍了如何在 pandas dataframe 中根据特定列的数值进行高效的数据筛选与截取。教程涵盖了布尔索引和 query() 方法两种核心技术,通过实例代码演示如何精确地获取满足条件的数据子集,这对于数据分析、可视化预处理至关重要,确保只处理或展示所需的数据范围。 在数据分析和处理中,我…

    2025年12月14日
    000
  • 利用Pandas与NumPy高效构建坐标DataFrame

    本文旨在指导读者如何基于现有DataFrame和索引列表,高效地构建一个新的坐标DataFrame。我们将探讨两种主要方法:基于循环和字典的迭代方法,以及利用NumPy高级索引和向量化操作的更优方法,旨在提高数据处理的效率和代码简洁性,为后续数据可视化(如路线绘制)奠定基础。 在数据分析和处理中,我…

    2025年12月14日
    000
  • Matplotlib动画中的全局变量管理与性能优化实践

    在使用Matplotlib的`FuncAnimation`模块创建动态数据可视化时,开发者经常会遇到需要实时更新内部状态变量的场景,例如模拟自适应滤波器(如CALP)的系数调整、物理系统的状态变化等。这种动态更新要求动画回调函数能够访问并修改这些状态变量。然而,如果不理解Python的变量作用域规则…

    2025年12月14日
    000
  • Pandas DataFrame 数据截取:基于列值高效筛选与切割

    本文详细介绍了如何在pandas dataframe中根据特定列的值进行数据截取和筛选。我们将探讨布尔索引、query() 方法以及结合 loc 进行筛选的多种高效技术,旨在帮助用户精确地从数据集中选择符合特定条件(如小于或等于某个阈值)的行,从而满足数据分析和可视化的需求,避免常见的筛选错误。 在…

    2025年12月14日
    000
  • PyCharm科学视图(SciView)功能变迁与替代方案指南

    本教程旨在解决pycharm professional用户关于sciview功能缺失的疑问。我们将探讨sciview在最新版本中的演变,解释其数据查看组件可能已被移除或整合,并提供当前pycharm中实现科学绘图可视化和数据结构检查的替代方案,包括利用“plots”工具窗口、增强的“variable…

    2025年12月14日
    000
  • Matplotlib动画中全局变量管理的最佳实践与常见陷阱

    本文深入探讨了在matplotlib中使用`funcanimation`进行动态可视化时,全局变量管理可能引发的阻塞问题。通过分析python的变量作用域规则,特别是函数内部对全局变量进行修改时的行为,我们揭示了为何不当使用`global`关键字会导致程序逻辑错误或“阻塞”现象。文章提供了使用`gl…

    2025年12月14日
    000
  • Pandas DataFrame高级重塑:拼接多级列索引与行索引

    本文旨在教授如何使用Pandas高效地重塑具有多级列索引的DataFrame。我们将通过一个具体示例,演示如何将DataFrame的最低层列索引与行索引进行拼接,并将其转换为新的列名,同时将原有的顶级列索引转换为新的行索引,最终得到一个扁平化、易于分析的数据结构。核心操作包括`stack()`、`t…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信