利用Pandas对DataFrame多列组合进行统计分析与结果展示

利用pandas对dataframe多列组合进行统计分析与结果展示

本文详细介绍了如何使用Pandas对DataFrame中多个分类列的组合进行高效的统计分析。通过groupby()和agg()方法,可以轻松计算每个组合的中间值、平均值、计数以及自定义分位数(如90%和10%)。文章还演示了如何使用reindex()确保所有可能的组合都被包含在结果中,并提供了迭代输出每个组合统计数据的方法,适用于需要对复杂数据进行多维度汇总分析的场景。

1. 引言

在数据分析中,我们经常需要根据DataFrame中多个分类变量的组合来计算数值型变量的统计量。例如,在一个包含产品类别、地区和时间等维度的销售数据集中,我们可能需要分析每个特定产品在特定地区和时间段内的销售额中位数、平均值、总销量以及销售额的分布情况(如90%和10%分位数)。本文将详细介绍如何使用Pandas库高效地完成这类任务,包括数据分组、多指标聚合、处理缺失组合以及结果的格式化输出

2. 准备示例数据

首先,我们创建一个示例DataFrame,它包含三个分类变量(Var1, Var2, Var3)和一个数值变量(Value),模拟实际数据场景。

import pandas as pdimport numpy as np# 创建示例数据data = {    'Var1': [True, False, True, False, True, False, True, False, True],    'Var2': [1, 2, 3, 1, 2, 3, 1, 2, 3],    'Var3': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],    'Value': [12, 93, 28, 23, 94, 12, 85, 23, 2]}df = pd.DataFrame(data)print("原始DataFrame:")print(df)

原始DataFrame:

   Var1  Var2 Var3  Value0   True     1    A     121  False     2    B     932   True     3    C     283  False     1    A     234   True     2    B     945  False     3    C     126   True     1    A     857  False     2    B     238   True     3    C      2

3. 多列组合的统计聚合

核心任务是计算Var1, Var2, Var3所有组合的Value列的统计数据。Pandas的groupby()结合agg()方法是实现这一目标的强大工具

3.1 使用 groupby() 和 agg()

我们将Var1, Var2, Var3作为分组键,然后对Value列应用多个聚合函数。agg()方法允许我们通过字典形式指定要计算的统计量及其对应的列名。

# 对指定列进行分组并计算统计量grouped_stats = df.groupby(["Var1", "Var2", "Var3"]).agg(    Med=("Value", "median"),        # 中位数    Mean=("Value", "mean"),          # 平均值    Count=("Value", "count"),        # 计数    q90=("Value", lambda x: x.quantile(q=0.9)), # 90%分位数    q10=("Value", lambda x: x.quantile(q=0.1))  # 10%分位数)print("n分组聚合后的统计数据(仅包含现有组合):")print(grouped_stats)

输出示例:

分组聚合后的统计数据(仅包含现有组合):                  Med  Mean  Count   q90   q10Var1  Var2 Var3                               False 1    A     23.0  23.0    1.0  23.0  23.0      2    B     58.0  58.0    2.0  81.0  35.0      3    C     12.0  12.0    1.0  12.0  12.0True  1    A     48.5  48.5    2.0  77.7  19.3      2    B     94.0  94.0    1.0  94.0  94.0      3    C     15.0  15.0    2.0  25.4  4.6

解释:

groupby([“Var1”, “Var2”, “Var3”]):将DataFrame按这三列的唯一组合进行分组。agg(…):对每个分组应用聚合函数。Med=(“Value”, “median”):计算Value列的中位数,并将结果命名为Med。Mean=(“Value”, “mean”):计算Value列的平均值,并将结果命名为Mean。Count=(“Value”, “count”):计算Value列的非空值数量,并将结果命名为Count。q90=(“Value”, lambda x: x.quantile(q=0.9)):使用匿名函数(lambda表达式)计算Value列的90%分位数,结果命名为q90。这是计算自定义分位数的常用且灵活的方法。q10=(“Value”, lambda x: x.quantile(q=0.1)):同理计算10%分位数,结果命名为q10。

4. 填充所有可能的组合

groupby()默认只返回数据中实际存在的组合。如果我们需要确保所有可能的组合(即使某些组合在原始数据中没有出现)都在结果中显示,并用NaN填充其统计数据,我们可以使用reindex()方法。

4.1 生成所有组合的MultiIndex

首先,我们需要手动生成所有可能的Var1, Var2, Var3组合。

# 获取所有列的唯一值var1_unique = df['Var1'].unique()var2_unique = df['Var2'].unique()var3_unique = df['Var3'].unique()# 创建所有可能的组合作为MultiIndexall_combinations_index = pd.MultiIndex.from_product(    [var1_unique, var2_unique, var3_unique],    names=["Var1", "Var2", "Var3"])# 使用reindex()将所有组合添加到结果中final_stats_df = grouped_stats.reindex(all_combinations_index)print("n填充所有组合后的统计数据:")print(final_stats_df)

输出示例:

填充所有组合后的统计数据:                  Med  Mean  Count   q90   q10Var1  Var2 Var3                               True  1    A     48.5  48.5    2.0  77.7  19.3           B      NaN   NaN    NaN   NaN   NaN           C      NaN   NaN    NaN   NaN   NaN      2    A      NaN   NaN    NaN   NaN   NaN           B     94.0  94.0    1.0  94.0  94.0           C      NaN   NaN    NaN   NaN   NaN      3    A      NaN   NaN    NaN   NaN   NaN           B      NaN   NaN    NaN   NaN   NaN           C     15.0  15.0    2.0  25.4   4.6False 1    A     23.0  23.0    1.0  23.0  23.0           B      NaN   NaN    NaN   NaN   NaN           C      NaN   NaN    NaN   NaN   NaN      2    A      NaN   NaN    NaN   NaN   NaN           B     58.0  58.0    2.0  81.0  35.0           C      NaN   NaN    NaN   NaN   NaN      3    A      NaN   NaN    NaN   NaN   NaN           B      NaN   NaN    NaN   NaN   NaN           C     12.0  12.0    1.0  12.0  12.0

解释:

pd.MultiIndex.from_product(…):根据每个变量的唯一值生成所有可能的笛卡尔积组合,创建一个新的MultiIndex。final_stats_df.reindex(all_combinations_index):将之前聚合的结果DataFrame grouped_stats 重新索引到包含所有可能组合的MultiIndex上。如果某个组合在grouped_stats中不存在,则其对应的统计量将填充NaN。

5. 迭代输出每个组合的统计数据

如果需要将每个组合的统计数据作为单独的DataFrame或以特定格式打印,可以再次使用groupby()方法对最终的统计DataFrame进行迭代。

print("n逐个组合输出统计数据:")# 迭代输出每个组合的统计数据for combo, stats_df in final_stats_df.groupby(level=[0, 1, 2]):    print(f"n组合: {combo}")    print(stats_df)    print("-" * 50)

输出示例:

逐个组合输出统计数据:组合: (True, 1, 'A')                  Med  Mean  Count   q90   q10Var1  Var2 Var3                               True  1    A     48.5  48.5    2.0  77.7  19.3--------------------------------------------------组合: (True, 1, 'B')                  Med  Mean  Count  q90  q10Var1  Var2 Var3                            True  1    B      NaN   NaN    NaN  NaN  NaN--------------------------------------------------... (省略其他组合)组合: (False, 3, 'C')                  Med  Mean  Count   q90   q10Var1  Var2 Var3                               False 3    C     12.0  12.0    1.0  12.0  12.0--------------------------------------------------

解释:

final_stats_df.groupby(level=[0, 1, 2]):这次的groupby()是基于final_stats_df的MultiIndex的三个层级进行分组。level参数指定了要分组的索引层级(0代表第一个索引,1代表第二个,以此类推)。循环中的combo变量会得到一个元组,代表当前分组的键(例如(True, 1, ‘A’)),stats_df则是该组合对应的单行DataFrame。

6. 完整代码示例

将上述所有步骤整合到一个完整的脚本中:

import pandas as pdimport numpy as np# 1. 准备示例数据data = {    'Var1': [True, False, True, False, True, False, True, False, True],    'Var2': [1, 2, 3, 1, 2, 3, 1, 2, 3],    'Var3': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],    'Value': [12, 93, 28, 23, 94, 12, 85, 23, 2]}df = pd.DataFrame(data)print("原始DataFrame:")print(df)print("-" * 50)# 2. 多列组合的统计聚合grouped_stats = df.groupby(["Var1", "Var2", "Var3"]).agg(    Med=("Value", "median"),    Mean=("Value", "mean"),    Count=("Value", "count"),    q90=("Value", lambda x: x.quantile(q=0.9)),    q10=("Value", lambda x: x.quantile(q=0.1)))print("n分组聚合后的统计数据(仅包含现有组合):")print(grouped_stats)print("-" * 50)# 3. 填充所有可能的组合var1_unique = df['Var1'].unique()var2_unique = df['Var2'].unique()var3_unique = df['Var3'].unique()all_combinations_index = pd.MultiIndex.from_product(    [var1_unique, var2_unique, var3_unique],    names=["Var1", "Var2", "Var3"])final_stats_df = grouped_stats.reindex(all_combinations_index)print("n填充所有组合后的统计数据:")print(final_stats_df)print("-" * 50)# 4. 迭代输出每个组合的统计数据print("n逐个组合输出统计数据:")for combo, stats_df in final_stats_df.groupby(level=[0, 1, 2]):    print(f"n组合: {combo}")    print(stats_df)    print("-" * 50)

7. 注意事项与总结

灵活性: agg()方法非常灵活,不仅支持内置的统计函数(如’median’, ‘mean’, ‘count’),还可以接受自定义函数(如lambda表达式)来计算更复杂的指标,如任意分位数。处理缺失组合: 使用pd.MultiIndex.from_product()生成所有可能的组合,再通过reindex()将聚合结果与完整组合对齐,是确保结果全面的关键步骤。这对于后续的数据可视化或报告生成非常有用,因为它能清晰地显示哪些组合没有数据。NaN值处理: reindex()操作会在没有数据的组合处引入NaN值。在后续分析或展示时,可能需要根据具体需求对这些NaN值进行处理,例如填充为0、删除,或在报告中明确指出。性能: 对于大型数据集,groupby().agg()是Pandas中高度优化的操作,通常比手动循环和筛选效率更高。输出格式: 本教程展示了将每个组合的统计数据单独打印的方法。在实际应用中,你也可以选择将final_stats_df作为一个整体的DataFrame进行保存、导出或进一步分析。

通过本文介绍的方法,你可以高效地对DataFrame中多个分类变量的组合进行多维度统计分析,并灵活地处理和展示结果,这在各种数据分析场景中都非常实用。

以上就是利用Pandas对DataFrame多列组合进行统计分析与结果展示的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 15:46:44
下一篇 2025年12月14日 15:46:55

相关推荐

  • Django ORM中实现高效父子表左连接的策略

    本文探讨了在Django ORM中实现父子表左连接的有效策略,特别是当需要包含所有父记录及其关联子记录(即使没有子记录)时。通过分析select_related和原生SQL的局限性,重点介绍了prefetch_related作为一种高效、内存友好的解决方案,它通过两次查询并在Python中完成连接,…

    好文分享 2025年12月14日
    000
  • Pandas时间序列:实现每日重置的滚动计算

    本文详细介绍了如何在Pandas时间序列数据中,实现expanding()函数按天重新开始计算的逻辑。通过将日期时间索引转换为单独的日期列,并结合groupby()方法,用户可以有效地对每日数据进行独立的累积统计分析,确保每个新的一天都从头开始计算其滚动指标,适用于需要分日统计的场景。 理解Pand…

    2025年12月14日
    000
  • 使用 Flask-SQLAlchemy 高效插入爬取数据教程

    本教程旨在指导开发者如何将爬取到的数据高效、安全地插入到使用 Flask-SQLAlchemy 构建的数据库中。文章将详细阐述从传统 SQL 语句到 ORM 模型的转变,重点介绍数据模型的定义、在 Flask 应用上下文中的数据插入操作,以及如何利用会话管理(db.session)和事务控制(com…

    2025年12月14日
    000
  • Python字典迭代与列表转换:理解键值对与生成字典列表的正确姿势

    本文深入探讨Python中字典的迭代机制及其在转换为列表时的常见误区。我们将阐明直接迭代字典只会获取键的原理,并演示如何利用items()方法获取键值对,并通过列表推导式高效地生成期望的字典列表。同时,文章还将对比csv.DictReader等特殊场景下,其迭代行为如何直接返回字典,以避免混淆。 1…

    2025年12月14日
    000
  • 解决 Selenium WebDriver 运行时出现的 TypeError

    本文旨在帮助开发者解决在使用 Selenium WebDriver 时遇到的 TypeError 问题。通过分析问题代码,找出错误根源,并提供修改后的代码示例,确保程序能够正确运行,成功抓取网页数据。本文将重点讲解如何使用正确的 find_elements 方法以及如何选择合适的选择器。 问题分析 …

    2025年12月14日
    000
  • Matplotlib subplots 轴对象解包错误解析与修正

    本文旨在解决在使用 matplotlib.pyplot.subplots 创建多子图时,因轴对象解包不当导致的 AttributeError: ‘numpy.ndarray’ object has no attribute ‘bar’ 错误。通过详细分…

    2025年12月14日
    000
  • Pandas时间序列:按日分组重置expanding()计算的实用指南

    在Pandas时间序列分析中,当需要对数据进行累积计算(如expanding().mean())时,若要求每个新的一天开始时重新启动计算,则常规方法不再适用。本教程将详细介绍如何利用groupby()结合日期信息,高效地实现按日分组的累积计算,确保每日统计的独立性和准确性,从而解决时间序列数据中按天…

    2025年12月14日
    000
  • Django常量翻译与AppRegistryNotReady错误解决方案

    本文旨在解决Django应用中为constants.py文件中的用户可读标签添加翻译支持时遇到的AppRegistryNotReady错误。当在模块导入时直接使用gettext_lazy进行翻译时,由于Django应用注册表尚未完全加载,尤其是在Celery或多进程环境中,会导致翻译基础设施初始化失…

    2025年12月14日
    000
  • SQLAlchemy异步会话管理:优化PostgreSQL连接池与会话关闭

    本文深入探讨了SQLAlchemy异步会话在PostgreSQL中连接持久性的问题。我们将解析SQLAlchemy连接池的工作机制,解释为何数据库连接在会话关闭后仍可能保持开放,并指导如何通过配置pool_size参数来管理连接池大小。同时,文章强调了使用上下文管理器进行异步会话管理的最佳实践,避免…

    2025年12月14日
    000
  • Pandas数据重塑:利用melt()函数将宽格式时间序列数据转换为长格式

    本教程详细介绍了如何使用Pandas库中的melt()函数,将常见的宽格式数据集(如以年份作为列的世界银行数据)高效地转换为更适合分析和可视化的长格式数据。通过具体的代码示例和参数解析,读者将学会如何将分散在多个列中的值聚合到一个新列中,并为原列名创建一个对应的标识列,从而实现数据结构的优化。 在数…

    2025年12月14日
    000
  • Python字典迭代与列表转换:从键到键值对的精确控制

    本文旨在深入探讨Python中字典的迭代行为,并指导如何将字典内容准确地转换为包含键值对的列表,而非仅仅是键的列表。文章将详细解释字典默认迭代机制,介绍dict.items()方法获取键值对,并通过列表推导式高效构建目标数据结构。此外,还将以csv.DictReader为例,阐明处理结构化数据时如何…

    2025年12月14日
    000
  • Matplotlib图像保存中的白边去除与精确裁剪教程

    本教程旨在解决使用Matplotlib显示图像后,在保存或通过浏览器下载时出现的恼人白边问题。我们将探讨传统Matplotlib保存方法的局限性,并重点介绍如何利用PIL/Pillow库进行图像的精确裁剪,以彻底消除这些不必要的边框,确保图像数据的纯净性,这对于图像处理和分析任务至关重要。 引言:M…

    2025年12月14日
    000
  • PyTorch高效矩阵操作:向量化优化指南

    本文旨在指导读者如何将PyTorch中低效的基于循环的矩阵操作转换为高性能的向量化实现。通过利用PyTorch的广播机制和张量操作,可以显著提升计算效率。文章将详细阐述从循环到向量化的转换步骤,并探讨浮点数运算的数值精度问题及验证方法。 在pytorch等深度学习框架中,python循环通常是性能瓶…

    2025年12月14日
    000
  • Python装饰器在嵌套函数调用中避免重复计时输出的策略

    本文探讨了在使用Python装饰器对嵌套函数进行计时时,如何避免因内部函数调用而产生的重复计时输出问题。通过在装饰器内部引入一个调用深度计数器,可以智能地控制计时信息的打印,确保只有指定深度的函数调用才输出计时结果,从而实现更精确和简洁的性能监控。 问题背景:装饰器与嵌套函数调用的冗余输出 在pyt…

    2025年12月14日
    000
  • Python 装饰器:优化嵌套函数计时输出的策略

    本文探讨了在Python中使用装饰器对嵌套函数进行计时时,如何避免因内部函数调用导致的重复输出问题。通过引入一个基于计数器的机制,本教程展示了如何精确控制计时信息的打印深度,确保只在指定调用层级进行输出,从而实现更清晰、更符合预期的日志行为。 装饰器在嵌套函数中的重复输出问题 在python开发中,…

    2025年12月14日
    000
  • Pandas时间序列数据中按日重置expanding()计算的实践指南

    本文详细介绍了如何在Pandas时间序列数据中,实现expanding()函数按日重置计算的需求。通过将时间序列索引转换为日期字符串并结合groupby()方法,可以有效地对每个新的一天独立应用累积计算,从而满足特定时间窗口内数据分析的场景,确保计算结果的准确性和业务逻辑的符合性。 理解 expan…

    2025年12月14日
    000
  • PyTorch中矩阵求和操作的高效向量化实现

    本教程深入探讨了如何在PyTorch中高效地向量化处理涉及矩阵求和的复杂操作,以避免低效的Python循环。通过利用PyTorch的广播机制和张量维度操作,我们将展示如何将逐元素计算转化为并行处理,显著提升计算性能和代码简洁性,并讨论数值精度问题。 1. 低效的循环式矩阵操作及其问题 在pytorc…

    2025年12月14日
    000
  • Python装饰器在嵌套函数中避免重复打印的技巧

    本文探讨了Python中对嵌套函数应用装饰器时,如何避免因内部函数调用而产生的冗余输出。通过在装饰器内部引入一个基于深度计数的机制,可以精确控制何时打印装饰器生成的输出,从而实现只在最外层或指定深度调用时才显示信息,同时保留内部函数独立调用的功能,有效解决了装饰器重复打印的问题。 问题描述 在pyt…

    2025年12月14日
    000
  • 使用Pillow库精确裁剪Matplotlib生成图像的白边

    本教程旨在解决使用Matplotlib显示图像后,在保存或下载时出现意外白边的问题。通过介绍Matplotlib尝试方案的局限性,文章核心内容聚焦于利用Pillow(PIL)库进行图像后处理,提供详细的Python代码示例,演示如何加载带有白边的图像,智能检测并裁剪掉多余的白色区域,最终生成无边框的…

    2025年12月14日
    000
  • 使用 Numba 加速数组统计:guvectorize 的正确使用姿势

    第一段引用上面的摘要: 本文旨在阐述如何使用 Numba 的 guvectorize 装饰器来加速数组统计计算,特别是当输出数组的形状与输入数组不同时。我们将通过示例代码详细解释 guvectorize 的正确用法,并讨论其与 njit 的区别与适用场景,帮助读者理解并掌握 Numba 优化数组操作…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信