从DataFrame多列组合提取中位数/均值等统计数据的实现
Pandas按多变量所有组合生成统计量方案
核心高效实现(推荐)
不需要手动遍历所有组合,Pandas的groupby+agg可以直接自动处理所有18种组合,代码简洁且性能最优:
- 先准备符合你描述的示例数据(假设需要统计的数值列为
Value):
import pandas as pd import numpy as np # 生成三个变量的所有组合 var1_vals = [True, False] var2_vals = [1, 2, 3] var3_vals = ['A', 'B', 'C'] # 构建包含所有组合的DataFrame combinations = pd.MultiIndex.from_product([var1_vals, var2_vals, var3_vals], names=['Var1', 'Var2', 'Var3']) df = pd.DataFrame({ 'Var1': combinations.get_level_values(0), 'Var2': combinations.get_level_values(1), 'Var3': combinations.get_level_values(2), 'Value': np.random.randn(18) * 10 + 50 # 随机生成待统计的数值列 })
- 分组计算目标统计量:
# 按三个变量分组,一次性计算中位数、均值、计数、分位数 stats_df = df.groupby(['Var1', 'Var2', 'Var3'])['Value'].agg( Med='median', Mean='mean', Count='count', P90=lambda x: x.quantile(0.9), P10=lambda x: x.quantile(0.1) ).reset_index() # 查看结果 print(stats_df)
groupby(['Var1','Var2','Var3'])会自动枚举所有18种组合的分组,agg参数直接指定每个统计量的别名和计算逻辑,一步到位生成统计结果。
手动遍历组合的实现(仅作逻辑演示)
如果你想明确遍历所有组合的逻辑,可以用三重循环枚举笛卡尔积,再逐个筛选计算,但这种方式效率低于groupby,仅作参考:
results = [] # 遍历Var1的所有唯一值 for var1 in var1_vals: # 遍历Var2的所有唯一值 for var2 in var2_vals: # 遍历Var3的所有唯一值 for var3 in var3_vals: # 筛选当前组合的子集数据 subset = df[(df['Var1'] == var1) & (df['Var2'] == var2) & (df['Var3'] == var3)] # 计算统计量并存入字典 combo_stats = { 'Var1': var1, 'Var2': var2, 'Var3': var3, 'Med': subset['Value'].median(), 'Mean': subset['Value'].mean(), 'Count': subset['Value'].count(), 'P90': subset['Value'].quantile(0.9), 'P10': subset['Value'].quantile(0.1) } results.append(combo_stats) # 转成DataFrame manual_stats_df = pd.DataFrame(results)
内容的提问来源于stack exchange,提问作者WUPD
相关产品推荐
相关产品推荐

