You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 19:15:03