如何用Pandas透视表或groupby计算分组条件下的概率百分比
计算Control/Treatment组中True/False的概率
先构造示例DataFrame方便演示:
import pandas as pd import numpy as np np.random.seed(42) df = pd.DataFrame({ 'group': np.random.choice(['control', 'treatment'], size=100), 'result': np.random.choice([True, False], size=100) })
方法一:使用groupby实现
直接通过分组+值计数归一化,一步得到概率:
# 分组计算各结果的概率,转成宽表格式 prob_groupby = df.groupby('group')['result'].value_counts(normalize=True).unstack() # 保留两位小数优化可读性 prob_groupby = prob_groupby.round(2) print(prob_groupby)
输出示例:
result False True group control 0.52 0.48 treatment 0.47 0.53
groupby('group')按control/treatment拆分数据value_counts(normalize=True)计算组内每个结果的占比(概率)unstack()将行索引中的True/False转为列,让结果更直观
方法二:使用pivot_table实现
先统计每组各结果的数量,再计算占比得到概率:
# 统计每组各结果的出现次数 count_pivot = pd.pivot_table( df, index='group', columns='result', aggfunc='size', fill_value=0 # 填充可能的缺失值(比如某组无某个结果) ) # 计算每行(组)的结果占比 prob_pivot = count_pivot.div(count_pivot.sum(axis=1), axis=0).round(2) print(prob_pivot)
输出和groupby方法一致。
aggfunc='size'用于统计每组各结果的数量div(count_pivot.sum(axis=1), axis=0)让每行的数值除以该行总数,得到概率
提取单个组的概率
如果需要单独查看某组的特定结果概率,直接从结果中提取即可:
# 获取treatment组False的概率 treatment_false_prob = prob_groupby.loc['treatment', False] print(f"Treatment组False的概率:{treatment_false_prob}")
内容的提问来源于stack exchange,提问作者Emerson EMSW9033
相关产品推荐
相关产品推荐

