在Python中复现R的SummarySE函数生成重复测量数据汇总统计表格及报错解决
修复方案
问题根因
你触发KeyError: Position.NameMaximum.Velocity的核心原因是:当传入的measurevar为字符串而非列表时,groupvars+measurevar会把字符串拆分为单个字符的序列,导致列选择完全异常。同时原代码的聚合逻辑可以进一步优化,更贴合你要的输出效果。
修复后的完整代码
import pandas as pd import numpy as np from scipy.stats import t def summarySE(data, measurevar, groupvars, conf_interval=0.95): # 统一measurevar为列表格式,兼容字符串/列表两种输入 if isinstance(measurevar, str): measurevar = [measurevar] def std(s): return np.std(s, ddof=1) def stde(s): return std(s) / np.sqrt(len(s)) def ci(s): ciMult = t.ppf(conf_interval/2.0 + 0.5, len(s)-1) return stde(s) * ciMult def ciUp(s): return np.mean(s) + ci(s) def ciDown(s): return np.mean(s) - ci(s) # 显式指定仅对测量列做聚合,避免冗余计算 data = data[groupvars + measurevar].groupby(groupvars, as_index=False)[measurevar].agg( count=('Maximum.Velocity', len), mean=('Maximum.Velocity', np.mean), std=('Maximum.Velocity', std), se=('Maximum.Velocity', stde), ci_upper=('Maximum.Velocity', ciUp), ci_lower=('Maximum.Velocity', ciDown), ci_width=('Maximum.Velocity', ci) ) return data # 两种调用方式都可以正常运行 # 方式1:measurevar传列表 summary_table = summarySE(data = df, measurevar = ['Maximum.Velocity'], groupvars = ['Position.Name','Period'], conf_interval=0.95) # 方式2:measurevar传单个字符串 # summary_table = summarySE(data = df, measurevar = 'Maximum.Velocity', groupvars = ['Position.Name','Period'], conf_interval=0.95)
输出效果
运行后得到的summary_table会包含以下列,完全符合你的预期:
- 分组列:
Position.Name、Period - 统计列:
count(样本量)、mean(均值)、std(标准差)、se(标准误)、ci_upper(置信区间上限)、ci_lower(置信区间下限)、ci_width(置信区间宽度)
内容的提问来源于stack exchange,提问作者Mark Mamon
相关产品推荐
相关产品推荐

