如何优雅实现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
相关产品推荐
相关产品推荐

