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

如何优雅实现Pandas按索引分组求Col3均值并去重?

问题描述

现有如下Pandas DataFrame:

import pandas as pd
import numpy as np

columns = ["Col1", "Col2", "Col3"]
values = np.array([[1, 1, 7], [1,1, 8], [1, 2, 5], 
                  [1, 2, 5.5]])
index = ["foo", "foo", "baz","baz"]

df = pd.DataFrame(values, index=index, columns = columns)

已知同一索引对应的Col1和Col2值一致,需求如下:

  • 对每个唯一索引,计算对应所有行的Col3均值;
  • 保留每个索引的一行,删除其余重复行;
  • 将该行的Col3值替换为计算得到的均值。

期望输出:

Col1    Col2    Col3
foo 1.0      1.0    7.50
baz 1.0      2.0    5.25

尝试过df.reset_index().groupby("index", sort=False)["Col3"].mean()得到均值,但需要手动赋值和去重,寻求简洁优雅的Pandas原生实现方法。

解决方案

方法1:groupby + 多列聚合

按索引分组后,对Col1/Col2取首个值(因同一索引下值一致),对Col3取均值,同时保留原索引顺序:

result = df.groupby(df.index, sort=False).agg(
    Col1=('Col1', 'first'),
    Col2=('Col2', 'first'),
    Col3=('Col3', 'mean')
)

方法2:transform + 去重

先通过transform计算每个索引对应的Col3均值并替换原列,再删除重复索引的行:

df['Col3'] = df.groupby(df.index)['Col3'].transform('mean')
result = df.drop_duplicates()

方法3:groupby.first() 结合assign

先分组保留Col1/Col2的首个值,再单独计算Col3的均值并赋值:

result = df.groupby(df.index, sort=False).first().assign(
    Col3=df.groupby(df.index)['Col3'].mean()
)

以上三种方法均无需手动赋值和去重,直接生成符合要求的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:17:06