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

如何在Pandas分组DataFrame中用均值替换行并保留唯一分组行

解决Pandas多列分组后保留唯一行并处理评分均值的问题

你已经用transform正确计算出了分组均值,接下来只需要把每个分组的行合并成唯一一行,并保留其他列的第一个值就行。这里有两种高效的方法可以实现你的需求:

方法一:直接使用分组聚合(推荐,更高效)

这种方法一步到位,直接通过groupby.agg定义每列的处理规则,不需要先修改原DataFrame再去重:

from collections import OrderedDict
import pandas as pd

csv_df = pd.DataFrame(OrderedDict({
    'reviewer_link': [1, 2, 3, 4, 1, 2, 3, 4], 
    'reviewer_demographics_residence_state': [ 'greece', 'greece', 'greece', 'greece', 'greece', 'italy', 'greece', 'greece'], 
    'attr_name': ['uffizi', 'uffizi', 'uffizi', 'uffizi', 'uffizi2', 'uffizi', 'uffizi', 'uffizi'], 
    'review_rate': [1, 2, 3, 4, 4, 3, 2, 1], 
    'dummy': [1, 2, 3, 4, 4, 3, 2, 1] 
}))

# 定义分组的三个键
group_columns = ['reviewer_demographics_residence_state', 'reviewer_link', 'attr_name']

# 构建聚合规则:评分取均值,其他列取分组内第一个值
aggregation_rules = {
    'review_rate': 'mean',
    # 自动适配所有其他非分组列
    **{col: 'first' for col in csv_df.columns if col not in group_columns + ['review_rate']}
}

# 执行分组聚合,as_index=False让分组键保持为普通列
final_df = csv_df.groupby(group_columns, as_index=False).agg(aggregation_rules)

print(final_df)

代码说明:

  • group_columns明确了我们的分组依据,后续如果需要调整分组键,只需要修改这个列表即可。
  • aggregation_rules里,我们给review_rate指定了mean计算均值,对其他所有列(包括你提到的更多列)自动使用first取分组内的第一个值,扩展性很强。
  • as_index=False确保分组后的结果不会把分组键设为索引,输出结构和你期望的完全匹配。

方法二:基于你已有的transform代码去重

如果你想沿用自己已经写好的transform逻辑,只需要在之后添加去重步骤即可:

from collections import OrderedDict
import pandas as pd

csv_df = pd.DataFrame(OrderedDict({
    'reviewer_link': [1, 2, 3, 4, 1, 2, 3, 4], 
    'reviewer_demographics_residence_state': [ 'greece', 'greece', 'greece', 'greece', 'greece', 'italy', 'greece', 'greece'], 
    'attr_name': ['uffizi', 'uffizi', 'uffizi', 'uffizi', 'uffizi2', 'uffizi', 'uffizi', 'uffizi'], 
    'review_rate': [1, 2, 3, 4, 4, 3, 2, 1], 
    'dummy': [1, 2, 3, 4, 4, 3, 2, 1] 
}))

group_columns = ['reviewer_demographics_residence_state', 'reviewer_link', 'attr_name']

# 你已有的计算均值代码
csv_df['review_rate'] = csv_df.groupby(group_columns)['review_rate'].transform('mean')

# 按分组键去重,保留每组的第一行
final_df = csv_df.drop_duplicates(subset=group_columns, keep='first')

print(final_df)

代码说明:

  • drop_duplicates的subset参数指定按哪几列去重,keep='first'确保保留分组内的第一行数据,这样dummy等列就会取到分组的第一个值。

两种方法最终输出的结果都和你手动制作的期望输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:30:57