如何在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
相关产品推荐
相关产品推荐

