利用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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Pandas时间序列:实现每日重置的滚动计算
上一篇 2025年12月14日 15:46:44
Django ORM中实现高效父子表左连接的策略
下一篇 2025年12月14日 15:46:55

相关推荐

  • win8系统自带应用打不开怎么办_win8内置应用闪退的解决方法

    win8系统自带应用打不开怎么办_win8内置应用闪退的解决方法win8系统自带应用打不开怎么办_win8内置应用闪退的解决方法win8系统自带应用打不开怎么办_win8内置应用闪退的解决方法win8系统自带应用打不开怎么办_win8内置应用闪退的解决方法

    win8自带应用打不开或闪退可按以下步骤解决:1.首先尝试重启电脑;2.检查应用商店更新;3.运行“windows 应用商店应用”疑难解答工具;4.清除应用商店缓存(使用wsreset.exe命令);5.通过powershell重新注册所有应用;6.运行sfc /scannow检查并修复系统文件;7…

    2026年9月3日 用户投稿
    000
  • 告别繁琐翻译:使用 Composer 和 appswithlove/statamic-one-click-content-translation 实现一键内容翻译

    最近我负责维护一个使用 statamic cms 搭建的多语言网站。随着网站内容的不断增加,手动翻译每一篇文章、每一页内容变得越来越繁琐,效率低下,而且容易出错。我需要一种更便捷、高效的解决方案来实现网站的多语言支持。 最初,我尝试使用一些在线翻译工具,但这些工具要么翻译质量不高,要么无法与 Sta…

    用户投稿 2026年9月3日
    000
  • win11麦克风没有声音怎么解决_win11麦克风无声音故障排查教程

    首先检查麦克风权限设置,确保系统和应用允许访问;接着确认硬件连接正常且未静音;然后在声音设置中将麦克风设为默认输入设备;运行音频疑难解答工具自动修复问题;最后更新或重装音频驱动程序以解决驱动异常。 如果您在使用Windows 11时发现麦克风没有声音,可能是由于权限设置、设备连接或驱动问题导致系统无…

    2026年9月3日
    000
  • 高效构建现代化GraphQL API:Hasura Extra Bundle 的实践

    最近,我负责一个使用symfony框架构建web api的项目。我们的后端需要一个强大的graphql引擎来处理数据,而hasura以其易用性和强大的功能脱颖而出。然而,将symfony与hasura集成起来却并非易事,需要处理大量的配置和代码。在尝试了多种方法后,我发现了hasura extra …

    用户投稿 2026年9月3日
    000
  • qq浏览器出现“aw, snap!”崩溃页面怎么办_qq浏览器崩溃错误修复方案

    1、使用QQ浏览器内置的一键修复工具可自动解决页面崩溃问题;2、清除全部时间范围的缓存与Cookie数据以排除文件冲突;3、关闭所有扩展并结束高耗能后台程序释放内存;4、重置浏览器设置恢复默认配置,排除错误参数影响。 如果您在使用QQ浏览器时遇到“Aw, Snap!”错误,导致网页无法正常加载并显示…

    2026年9月3日
    000
  • 夸克网盘资源去哪里搜 夸克网盘高质量资源网入口

    夸克网盘资源可通过聚合搜索平台https://www.upyunso.com/高效获取,该平台聚合多网盘资源,支持精准筛选、纯净界面与实时更新,提升搜索效率。 一、夸克网盘资源搜索概述 夸克网盘凭借其高速下载和超大空间的特点,已成为许多用户存储和分享资料的重要工具。然而,如何在这海量的分享资源中快速…

    2026年9月3日
    300
  • 桌面窗口管理器占用内存过高怎么办 分享5个解决方法

    桌面窗口管理器占用内存过高怎么办 分享5个解决方法桌面窗口管理器占用内存过高怎么办 分享5个解决方法桌面窗口管理器占用内存过高怎么办 分享5个解决方法桌面窗口管理器占用内存过高怎么办 分享5个解决方法

    桌面窗口管理器(dwm)是 windows 操作系统中不可或缺的组件,主要负责图形界面的视觉呈现,例如窗口透明度、动画切换以及阴影效果等。当 dwm 占用内存异常时,可能导致系统卡顿、响应迟缓,影响日常使用体验。本文将介绍几种实用的优化方法,帮助您有效降低桌面窗口管理器的内存消耗。 一、减少系统视觉…

    2026年9月3日 用户投稿
    100
  • win10夜灯模式打不开或灰色怎么办_Win10夜间模式无法开启问题解决方案

    如果您尝试在Windows 10系统中开启夜灯模式,却发现该功能无法打开或选项呈现灰色不可用状态,则可能是由于系统设置、驱动程序或第三方软件干扰所致。以下是解决此问题的步骤: 本文运行环境:Dell XPS 13,Windows 10 专业版。 一、检查显示驱动是否正常 夜灯模式依赖于显卡驱动正常工…

    2026年9月3日
    000
  • 快兔网盘网页版如何新建文件夹_快兔网盘网页版新建文件夹方法

    1、登录快兔网盘网页版后,通过顶部工具栏“新建”按钮选择“新建文件夹”并命名即可创建;2、在文件列表空白处右键,选择“新建文件夹”进行重命名操作;3、部分版本可在地址栏旁点击“+”号或“添加”图标,选择文件夹类型并输入名称完成创建。 如果您在使用快兔网盘网页版时需要整理文件,但找不到创建新文件夹的选…

    2026年9月3日
    000
  • u盘损坏无法读取怎么恢复数据 详细教程与解决方案

    u盘损坏无法读取怎么恢复数据 详细教程与解决方案u盘损坏无法读取怎么恢复数据 详细教程与解决方案u盘损坏无法读取怎么恢复数据 详细教程与解决方案u盘损坏无法读取怎么恢复数据 详细教程与解决方案

    u盘因其便携性强、存储容量大以及读写便捷等优点,已成为日常学习、办公和生活中不可或缺的存储工具。然而,不少用户都曾遭遇过u盘无法读取的问题:电脑提示“请插入磁盘”、“磁盘需要格式化才能使用”,甚至u盘插入后毫无反应。面对这种情况,存储在其中的重要文件还有希望找回吗?本文将深入分析u盘损坏的常见原因,…

    2026年9月3日 用户投稿
    000
  • ao3挑战赛怎么参加_ao3加入和发布同人挑战活动

    ao3挑战赛怎么参加_ao3加入和发布同人挑战活动ao3挑战赛怎么参加_ao3加入和发布同人挑战活动ao3挑战赛怎么参加_ao3加入和发布同人挑战活动ao3挑战赛怎么参加_ao3加入和发布同人挑战活动

    首先注册AO3账号并完善资料,接着通过Challenges模块查找或创建挑战活动,按规则报名后在规定时间内创作并上传标记正确的同人作品完成参与。 如果您想在Archive of Our Own(AO3)上参与或发起一项同人创作挑战活动,但不清楚具体流程和规则,可以通过以下方式完成操作。此类活动通常由…

    2026年9月3日 用户投稿
    000
  • 如何隐藏IDEA控制台中的打印机图标?

    隐藏 idea 控制台中的打印机图标 IDEA 控制台右下角的打印机图标常常会带来误操作,因此以下几个步骤教你如何将其隐藏: 启用“调试工具栏” 在 IDEA 中,选择 “视图” > “工具栏” > “调试工具栏”。…

    用户投稿 2026年9月3日
    000
  • Excel表格怎么分列_Excel文本分列功能使用方法详解

    Excel文本分列功能可将一列混合数据按分隔符或固定宽度拆分为多列。首先选中数据列,点击“数据”→“分列”,根据数据特点选择“分隔符号”或“固定宽度”。若使用分隔符号,勾选对应符号(如逗号、空格或手动输入顿号),预览拆分效果后设置各列数据格式并指定目标区域;若采用固定宽度,则在预览界面手动添加分列线…

    2026年9月3日
    400
  • win10怎么检查磁盘错误_win10磁盘错误检查与修复方法

    1、通过“此电脑”属性中的“工具”选项卡使用错误检查功能可快速修复文件系统逻辑错误;2、使用管理员权限运行命令提示符并输入“chkdsk C: /f /r”命令可深入扫描并修复磁盘错误及坏扇区;3、运行“sfc /scannow”命令可修复受损的系统核心文件以提升系统稳定性;4、通过“计算机管理”中…

    2026年9月3日
    000
  • VS Code插件开发中,如何用绝对路径正确导入JS模块并解决运行时报错?

    VS Code插件开发中,绝对路径JS模块导入及运行时错误解决方案 许多VS Code插件开发者在使用绝对路径导入JS模块时遇到问题:代码提示正常,但运行时却报错“cannot find module”。本文将详细解释如何解决此问题。 问题: 开发者使用jsconfig.js配置路径别名: { “c…

    2026年9月3日
    000
  • IntelliJ IDEA控制台右下角打印机图标如何去除?

    去除IntelliJ IDEA控制台打印机图标的简易方法 IntelliJ IDEA控制台右下角的打印机图标虽然不起眼,却可能造成误操作。 本文提供快速去除该图标的步骤。 操作步骤: 打开IntelliJ IDEA的文件菜单。选择设置 (或Preferences,取决于您的操作系统)。在设置对话框中…

    2026年9月3日
    000
  • 抖音站外激励计划投放在哪里?抖音站外激励怎么挣钱

    在移动互联网迅猛发展的今天,抖音作为主流短视频平台之一,已成为品牌推广和营销的重要渠道。其中,抖音站外激励计划因其高效的传播效果和可观的回报,受到越来越多商家和创作者的关注。那么,抖音站外激励计划究竟投放在哪些渠道?又该如何通过这一计划实现变现?本文将为您全面解析。 一、什么是抖音站外激励计划? 抖…

    2026年9月3日
    100
  • 提升MediaWiki语义扩展效率:Semantic Extra Special Properties 的安装与应用

    最近在维护一个基于 mediawiki 的知识库项目时,需要扩展其语义功能,以便更好地组织和检索信息。我选择了 semantic extra special properties (sesp) 扩展,因为它提供了许多额外的特殊属性,可以满足我的需求。然而,按照官方文档提供的安装步骤,需要手动下载文件…

    用户投稿 2026年9月3日
    000
  • 如何有效清除import()动态导入的JS模块缓存?

    动态导入JS模块及缓存清除策略 使用JavaScript的import()函数动态导入模块时,浏览器默认启用缓存机制。这在需要频繁更新模块内容的场景下可能导致问题。本文探讨有效清除import()导入JS模块缓存的方法,并分析常见问题。 核心问题在于如何避免import()动态导入JS脚本时缓存的影…

    2026年9月3日
    000
  • win8兼容模式在哪里设置_win8程序兼容模式设置方法

    答案:通过兼容模式可解决旧版程序在Windows 8.1上无法运行的问题。具体方法包括手动设置兼容模式,选择如Windows 7等早期版本,并可勾选以管理员身份运行;或使用系统自带的兼容性疑难解答工具自动检测并应用最佳设置,最后测试程序是否正常启动。 如果您尝试在较新的Windows 8系统上运行旧…

    2026年9月3日
    000

发表回复

登录后才能评论
关注微信