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

如何在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)

为什么你的原代码会出错?

  1. 分组逻辑错误:你在第二个循环里用了set(df['sequence']),这是整个DataFrame的sequence集合,没有结合当前的Copy进行筛选,导致同一个sequence被不同Copy重复处理,最终只保留了最后一次计算的结果。
  2. 行添加方式问题:用df.loc[-1] = newrow每次都把新行加在DataFrame末尾,没有按分组排序,所以最终行的位置混乱。

输出结果

运行上述代码后,你会得到完全符合预期的目标DataFrame,每个Copy+sequence分组下都会正确添加R类型的平均值行,顺序也完全匹配你的示例。

内容的提问来源于stack exchange,提问作者Cave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:46:43