如何用pandas按指定列去重并保留F列最大值同时保留其余列
问题根源
你当前的代码在groupby后调用max()仅提取了F列,自然会丢失其余列;且直接对全量分组结果取最大值,会将其他列也做最大值聚合,无法保留F取最大值行对应的原始列值。
可行解决方案
推荐两种可直接落地的实现方式,均可保留所有原始列:
方法1:排序后去重(逻辑更直观)
先对数据按分组键和F列降序排序,让每个分组内F最大的行排在最前,再按分组键去重保留首行即可:
import pandas as pd df = pd.DataFrame(data) # 保留你原有的时间转换逻辑 df['E'] = pd.to_datetime(df['E'], unit='ms').dt.date # 按A、C分组,组内按F降序排序 df_sorted = df.sort_values(by=['A', 'C', 'F'], ascending=[True, True, False]) # 按A、C去重,保留F最大的第一行 df_result = df_sorted.drop_duplicates(subset=['A', 'C'], keep='first').reset_index(drop=True)
方法2:分组掩码筛选
通过transform生成每个分组内F等于最大值的布尔掩码,直接筛选符合条件的行:
import pandas as pd df = pd.DataFrame(data) df['E'] = pd.to_datetime(df['E'], unit='ms').dt.date # 生成每个[A,C]分组内F为最大值的掩码 max_f_mask = df['F'] == df.groupby(['A', 'C'])['F'].transform('max') # 筛选符合条件的行 df_result = df[max_f_mask].reset_index(drop=True)
补充说明
如果同一个[A,C]分组内存在多行F值同为最大值的情况,两种方法都会保留所有符合条件的行,不会额外过滤。
内容的提问来源于stack exchange,提问作者Rebecca
相关产品推荐
相关产品推荐

