如何对pandas DataFrame每行计算95% t分布置信区间,适配大规模数据?
实现方案
完全可以实现,数百行规模的DataFrame用常规方法就能轻松处理,超大规模数据也可以用向量化方案优化性能。
前置依赖
需要用到pandas、numpy和scipy三个库,导入方式如下:
import pandas as pd import numpy as np from scipy import stats
方法1:逐行计算(适配数百~数千行规模)
直接通过apply按行迭代计算95%置信区间,代码简单易读:
# 构造示例DataFrame df = pd.DataFrame({'nums_1': [1, 2, 3], 'nums_2': [1, 1, 5], 'nums_3' : [8,7,9]}) # 按行计算95%置信区间,拆分结果为上下限两列 df[['ci_95_lower', 'ci_95_upper']] = df.apply( lambda row: stats.t.interval( confidence=0.95, df=len(row)-1, # 自由度为样本量减1 loc=row.mean(), scale=stats.sem(row) # 标准误 ), axis=1, result_type='expand' )
方法2:向量化计算(适配万行以上超大规模)
如果需要处理十万级以上行数的DataFrame,推荐用向量化运算代替逐行迭代,性能提升10~100倍:
n = df.shape[1] # 每行的样本量 # 全局计算均值、标准误、t临界值,无逐行遍历开销 row_mean = df.mean(axis=1) row_sem = df.std(axis=1, ddof=1) / np.sqrt(n) t_critical = stats.t.ppf(1 - (1-0.95)/2, df=n-1) # 直接批量计算所有行的置信区间上下限 df['ci_95_lower'] = row_mean - t_critical * row_sem df['ci_95_upper'] = row_mean + t_critical * row_sem
两种方法计算结果完全一致,可根据自身数据规模选择即可。
内容的提问来源于stack exchange,提问作者Niam45
相关产品推荐
相关产品推荐

