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

如何用均值行替换数据集重复行并保留首行索引

问题描述

我有一个包含重复行的数据集,此前我通常使用以下代码删除重复行:

df = df.reset_index()
df.drop_duplicates(subset="CID",keep="first")   

missing_rows = ~df.isin(df2).all(axis=1)
missing_index = df.loc[missing_rows].index

但我希望用同一CID分组的均值行替换该组的首行,同时保留首行的原始索引——我需要保留正确的索引,因为之后要从协方差矩阵中移除对应的行列。我尝试了以下代码,但未能成功:

# 创建列存储每组首行的索引
df['first_index'] = df.groupby(['CID' ]).transform('first').index

# 按CID分组计算均值
df2 = df.groupby(['CID' ]).mean() 
 
uff= df.drop_duplicates(subset="CID",keep="first")
# 将均值行的索引设置为对应组的首行索引
df2.index = uff["first_index"]
解决方案

可以通过以下步骤实现需求,确保保留原始首行索引的同时用均值替换对应行:

方法一:全列替换(仅数值列数据集)

# 按CID分组,获取每组的首行原始索引和均值
grouped = df.groupby('CID')
first_indices = grouped.apply(lambda x: x.index[0])
group_means = grouped.mean(numeric_only=True)

# 用每组均值替换原数据中的首行
for cid, idx in first_indices.items():
    df.loc[idx] = group_means.loc[cid].values

# 删除重复行,仅保留替换后的首行
df = df.drop_duplicates(subset='CID', keep='first')

方法二:仅替换数值列(保留非数值列)

如果数据集中存在非数值列(比如CID本身),可以只更新数值列,避免覆盖非数值内容:

# 筛选数值列
numeric_cols = df.select_dtypes(include='number').columns

# 按CID分组获取首行索引和数值列均值
grouped = df.groupby('CID')
first_indices = grouped.apply(lambda x: x.index[0])
group_means = grouped[numeric_cols].mean()

# 仅替换首行的数值列内容
for cid, idx in first_indices.items():
    df.loc[idx, numeric_cols] = group_means.loc[cid].values

# 删除重复行
df = df.drop_duplicates(subset='CID', keep='first')

关键说明

  • grouped.apply(lambda x: x.index[0]):直接获取每组首行的原始索引,避免手动创建额外列导致的索引混乱
  • numeric_only=True:确保仅对数值列计算均值,防止非数值列被错误处理
  • 先替换首行再删除重复,保证最终保留的行是替换了均值的版本,且索引完全匹配原数据集的首行索引,满足后续协方差矩阵操作的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:02:21