
本文将介绍如何使用 Pandas 库对 DataFrame 中多个列的组合进行分组,并计算每个组合的统计数据,包括中位数、平均值、计数、90% 分位数和 10% 分位数。通过 groupby() 和 agg() 函数的结合使用,可以高效地实现这一目标,并展示了如何遍历所有可能的组合以生成独立的统计 DataFrame。
问题描述
假设我们有一个 DataFrame,包含多个变量(例如 Var1、Var2、Var3)和一个数值列 Value。我们的目标是针对 Var1、Var2 和 Var3 的所有可能组合,计算 Value 列的统计信息,并将结果以 DataFrame 的形式呈现。
解决方案
以下代码演示了如何使用 Pandas 实现这一目标:
云点滴客户解决方案是针对中小企业量身制定的具有简单易用、功能强大、永久免费使用、终身升级维护的智能化客户解决方案。依托功能强大、安全稳定的阿里云平 台,性价比高、扩展性好、安全性高、稳定性好。高内聚低耦合的模块化设计,使得每个模块最大限度的满足需求,相关模块的组合能满足用户的一系列要求。简单 易用的云备份使得用户随时随地简单、安全、可靠的备份客户信息。功能强大的报表统计使得用户大数据分析变的简单,
import pandas as pd
# 示例 DataFrame (您可以替换为您自己的数据)
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)
# 使用 groupby() 和 agg() 函数计算统计数据
df = 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)),
)
# 确保所有可能的组合都存在
df = df.reindex(
pd.MultiIndex.from_product(
[[True, False], [1, 2, 3], ["A", "B", "C"]], names=["Var1", "Var2", "Var3"]
)
)
# 打印每个组合的 DataFrame
for _, g in df.groupby(level=[0, 1, 2]):
print(g)
print("-" * 80)代码解释:
- 导入 Pandas: 导入 Pandas 库,用于数据处理。
- 创建示例 DataFrame: 创建一个包含示例数据的 DataFrame。你需要将这个 DataFrame 替换为你自己的数据。
-
groupby() 和 agg(): 使用 groupby() 函数按照 Var1、Var2 和 Var3 列进行分组。然后,使用 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)): 计算 Value 列的 90% 分位数,并将结果命名为 q90。 这里使用了 lambda 函数来调用 quantile() 方法。
- q10=("Value", lambda x: x.quantile(q=0.1)): 计算 Value 列的 10% 分位数,并将结果命名为 q10。 同样使用了 lambda 函数。
- reindex(): 这一步非常重要,它确保了即使某些组合在原始数据中不存在,结果 DataFrame 中也会包含这些组合,并且对应的值为 NaN。 pd.MultiIndex.from_product() 创建一个包含所有可能的组合的多级索引。
- 遍历和打印: 使用 groupby(level=[0, 1, 2]) 再次对 DataFrame 进行分组,这次是为了按照多级索引的级别(Var1、Var2、Var3)进行分组。然后,遍历每个组,并打印出对应的 DataFrame。
注意事项
- 确保你的 Pandas 版本是最新的,以获得最佳性能和功能。
- 如果你的 DataFrame 非常大,可以考虑使用 dask 库进行并行计算,以提高效率。
- 可以根据需要修改 agg() 函数中的聚合函数,以计算其他统计信息。
- 如果某些组合在原始数据中不存在,则计算出的统计数据将为 NaN。reindex() 方法可以确保所有组合都被包含,即使它们在原始数据中不存在。
总结
通过结合使用 Pandas 的 groupby() 和 agg() 函数,可以轻松地计算 DataFrame 中多个列组合的统计数据。 reindex() 函数可以确保所有可能的组合都包含在结果中,即使某些组合在原始数据中不存在。 这种方法非常灵活,可以根据需要进行定制,以满足不同的数据分析需求。









