如何为Pandas DataFrame按分组添加CI置信区间上下限列
实现方法
按AgeGroup和ind双字段分组计算values列的置信区间上下限,再将分组计算结果合并回原DataFrame,即可实现同组所有行匹配相同CI值的效果,完全匹配你期望的输出结构。
完整可运行代码
import pandas as pd from scipy import stats # 定义分组置信区间计算函数,默认计算95%置信区间 def get_confidence_interval(group, conf_level=0.95): values = group['values'] group_mean = values.mean() # 计算标准误 standard_err = stats.sem(values) # 计算边际误差(小样本用t分布,大样本可替换为正态分布) margin_err = standard_err * stats.t.ppf((1 + conf_level) / 2, len(values) - 1) return pd.Series({ 'Lower_Bound': group_mean - margin_err, 'Upper_Bound': group_mean + margin_err }) # 双字段分组计算各分组的CI上下限 ci_result = merged.groupby(['AgeGroup', 'ind']).apply(get_confidence_interval).reset_index() # 将CI结果合并回原表 merged = merged.merge(ci_result, on=['AgeGroup', 'ind'], how='left')
参数调整说明
- 如果需要修改置信水平,直接给
get_confidence_interval传参即可,例如要计算90%置信区间,将apply部分改为.apply(get_confidence_interval, conf_level=0.9) - 如果样本量足够大需要用正态分布近似计算,将计算
margin_err的代码替换为margin_err = standard_err * stats.norm.ppf((1 + conf_level) / 2)即可 - 如果需要和示例输出完全一致把
Upper_Bound放在Lower_Bound前面,最后加一行代码调整列顺序即可:merged = merged[['AgeGroup', 'values', 'ind', 'Upper_Bound', 'Lower_Bound']]
内容的提问来源于stack exchange,提问作者Tessa
相关产品推荐
相关产品推荐

