
本文详细介绍了如何使用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
微信扫一扫
支付宝扫一扫