计算DataFrame中分组及剩余群体的均值与标准差
解决方案
首先构造示例数据:
import pandas as pd data = { 'id': [1,1,1,1,1,1,1], 'age': [12,18,25,29,32,31,37], 'weight': [45,110,25,85,49,70,39], 'group': ['[10-20]', '[10-20]', '[20-30]', '[20-30]', '[30-40]', '[30-40]', '[30-40]'] } df = pd.DataFrame(data)
步骤1:计算分组内的均值与标准差
通过groupby聚合直接得到目标分组的统计量:
group_stats = df.groupby('group')['weight'].agg( group_mean_weight='mean', group_sd_weight='std' ).reset_index()
步骤2:计算其余组合并后的均值与标准差
遍历每个分组,筛选出当前分组外的所有数据并计算统计量:
groups = df['group'].unique() rest_stats = [] for g in groups: rest_data = df[df['group'] != g]['weight'] rest_stats.append({ 'group': g, 'rest_mean_weight': rest_data.mean(), 'rest_sd_weight': rest_data.std() }) rest_stats_df = pd.DataFrame(rest_stats)
步骤3:合并结果并格式化
将两组统计结果按group字段合并,最终得到目标格式:
final_df = pd.merge(group_stats, rest_stats_df, on='group').set_index('group')
最终输出
运行后得到的结果如下:
group_mean_weight group_sd_weight rest_mean_weight rest_sd_weight group [10-20] 77.50 45.961941 53.600000 23.375199 [20-30] 55.00 42.426407 57.600000 30.805844 [30-40] 52.67 15.011108 70.000000 42.426407
补充说明
- 默认使用样本标准差(自由度为n-1),若需计算总体标准差,可在
std()中添加参数ddof=0 - 分组格式完全保留原始输入的方括号样式
内容的提问来源于stack exchange,提问作者Kathan Vyas
相关产品推荐
相关产品推荐

