如何在Pandas DataFrame中按Copy和Sequence分组添加均值行
解决Pandas分组添加平均值行的问题
你的核心问题出在没有同时按Copy和sequence进行分组筛选,而且手动循环添加行的方式既低效又容易导致索引混乱,最终只得到2个平均值而非预期的6个,行的位置也不符合要求。下面是更简洁高效的Pandas解决方案:
步骤1:生成需要添加的平均值行
我们可以用groupby同时按Copy和sequence分组,筛选出type为R2和R3的行,计算ntv的平均值,再构造出type为R的新行:
import pandas as pd # 构造你的原始DataFrame(方便测试) data = [ [1, 1, 'A', 0.45], [1, 1, 'R2', 0.878], [1, 1, 'R3', 1.234], [1, 2, 'A', -7.890], [1, 2, 'R2', 2.345], [1, 2, 'R3', -0.871], [2, 1, 'A', -0.098], [2, 1, 'R2', -0.007], [2, 1, 'R3', 9.089], [2, 2, 'A', 1.567], [2, 2, 'R2', -0.764], [2, 2, 'R3', 17.908], [3, 1, 'A', 4.980], [3, 1, 'R2', 2.34], [3, 1, 'R3', 1.280], [3, 2, 'A', -9.189], [3, 2, 'R2', -7.09], [3, 2, 'R3', -0.009] ] df = pd.DataFrame(data, columns=['Copy', 'sequence', 'type', 'ntv']) # 生成R类型的平均值行 avg_rows = df[df['type'].isin(['R2', 'R3'])] \ .groupby(['Copy', 'sequence'], as_index=False)['ntv'] \ .mean() \ .assign(type='R')
步骤2:合并数据并排序
把原始数据和新生成的平均值行合并,然后按Copy、sequence排序,同时自定义type的顺序,确保R行出现在每个分组的最后:
# 合并原始数据和新行 result = pd.concat([df, avg_rows], ignore_index=True) # 自定义type的顺序,保证A→R2→R3→R的排列 type_sort_order = {'A': 0, 'R2': 1, 'R3': 2, 'R': 3} result['sort_key'] = result['type'].map(type_sort_order) # 排序并清理临时列 result = result.sort_values(by=['Copy', 'sequence', 'sort_key']) \ .drop('sort_key', axis=1) \ .reset_index(drop=True) print(result)
为什么你的原代码会出错?
- 分组逻辑错误:你在第二个循环里用了
set(df['sequence']),这是整个DataFrame的sequence集合,没有结合当前的Copy进行筛选,导致同一个sequence被不同Copy重复处理,最终只保留了最后一次计算的结果。 - 行添加方式问题:用
df.loc[-1] = newrow每次都把新行加在DataFrame末尾,没有按分组排序,所以最终行的位置混乱。
输出结果
运行上述代码后,你会得到完全符合预期的目标DataFrame,每个Copy+sequence分组下都会正确添加R类型的平均值行,顺序也完全匹配你的示例。
内容的提问来源于stack exchange,提问作者Cave
相关产品推荐
相关产品推荐

