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

花韻仙語
发布: 2025-10-07 16:17:44
原创
269人浏览过

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

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

1. 引言

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

2. 准备示例数据

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

import pandas as pd
import 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  Value
0   True     1    A     12
1  False     2    B     93
2   True     3    C     28
3  False     1    A     23
4   True     2    B     94
5  False     3    C     12
6   True     1    A     85
7  False     2    B     23
8   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   q10
Var1  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.0
True  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组合。

火龙果写作
火龙果写作

用火龙果,轻松写作,通过校对、改写、扩展等功能实现高质量内容生产。

火龙果写作 106
查看详情 火龙果写作
# 获取所有列的唯一值
var1_unique = df['Var1'].unique()
var2_unique = df['Var2'].unique()
var3_unique = df['Var3'].unique()

# 创建所有可能的组合作为MultiIndex
all_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   q10
Var1  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.6
False 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   q10
Var1  Var2 Var3                               
True  1    A     48.5  48.5    2.0  77.7  19.3
--------------------------------------------------

组合: (True, 1, 'B')
                  Med  Mean  Count  q90  q10
Var1  Var2 Var3                            
True  1    B      NaN   NaN    NaN  NaN  NaN
--------------------------------------------------

... (省略其他组合)

组合: (False, 3, 'C')
                  Med  Mean  Count   q90   q10
Var1  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 pd
import 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多列组合进行统计分析与结果展示的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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