如何解决Pandas按患者分组求平均的KeyError并修改索引?
解决Pandas分组均值计算的KeyError并实现需求
错误原因分析
你遇到的KeyError: -1是因为代码中treatment_df[-1]试图通过整数-1引用列,但Pandas中直接用整数作为列索引仅适用于列名是整数的场景,而你的最后一列列名为patient,因此会触发键不存在的错误。
实现步骤与代码示例
假设你的输入DataFrame结构如下(包含治疗指标列和最后一列patient,格式为[分组标识]_P[编号]):
import pandas as pd # 示例输入DataFrame data = { 'treatment_A': [10, 12, 11, 9, 13, 8, 7, 9, 10, 11], 'treatment_B': [20, 22, 21, 19, 23, 18, 17, 19, 20, 21], 'patient': ['T1_P1', 'T1_P2', 'T1_P3', 'T1_P4', 'T1_P5', 'T2_P1', 'T2_P2', 'T2_P3', 'T2_P4', 'T2_P5'] } treatment_df = pd.DataFrame(data)
1. 正确分组计算均值
根据patient列的P1-P5重复规则,我们提取patient列中第一个下划线前的分组标识(如T1、T2)作为分组键,再计算每组的均值:
# 提取分组标识:拆分patient列,取第一个下划线前的部分 group_keys = treatment_df['patient'].str.split('_').str[0] # 分组计算数值列的均值 mean_df = treatment_df.groupby(group_keys).mean(numeric_only=True)
2. 索引自动符合需求
上述代码生成的mean_df索引已经是去除_P1至_P5的分组标识,无需额外修改,预期输出如下:
treatment_A treatment_B group_keys T1 11.0 21.0 T2 9.0 19.0
备选:按固定行数(每5行)分组
如果你的分组规则是严格每5行一组(不依赖patient列内容),可以用以下代码:
import numpy as np # 按每5行分组计算均值 mean_df = treatment_df.groupby(np.arange(len(treatment_df)) // 5).mean(numeric_only=True) # 从原patient列提取每组的分组标识作为新索引 mean_df.index = treatment_df['patient'].str.split('_').str[0].iloc[::5].tolist()
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

