按A、B列分组取C、D列最大值并匹配E、F列对应值的实现
源数据
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| qwe | asd | TRUE | 2 | 123 | 999 |
| qwe | asd | TRUE | 4 | 456 | 888 |
| qwe | asd | FALSE | 4 | 789 | 777 |
| qwe | asd | TRUE | 3 | 101 | 666 |
需求
按A、B列分组,获取C、D列的最大值(D列在C为TRUE/FALSE时可能出现相同值),同时保留对应的E、F列数值。
期望输出
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| qwe | asd | TRUE | 4 | 456 | 888 |
已尝试代码
columns = ['A','B'] df2.groupby(columns,as_index=False, dropna=False)[['C','D']].max()
执行结果
| A | B | C | D |
|---|---|---|---|
| qwe | asd | TRUE | 4 |
问题
目前仅能得到A、B、C、D列的结果,无法获取对应的E、F列数值。
解决方案
核心逻辑是:先锁定C列最大值对应的行(布尔值中TRUE大于FALSE),再在这些行里找到D列最大值的记录,从而带出对应的E、F列。以下两种方法都能实现:
方法1:分步筛选目标行
# 筛选出每组内C列等于最大值的行 mask = df2['C'] == df2.groupby(['A','B'])['C'].transform('max') filtered_df = df2[mask] # 找到筛选后每组内D列最大值对应的行索引 target_idx = filtered_df.groupby(['A','B'])['D'].idxmax() # 提取最终结果 result = df2.loc[target_idx].reset_index(drop=True)
方法2:排序后取组内首行
利用布尔值排序特性,先按A、B分组,组内按C降序、D降序排序,直接取每组第一行:
result = df2.sort_values(['A','B','C','D'], ascending=[True, True, False, False]) \ .groupby(['A','B'], as_index=False, dropna=False).first()
验证结果
运行上述任意代码后,输出与期望完全一致:
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| qwe | asd | TRUE | 4 | 456 | 888 |
内容的提问来源于stack exchange,提问作者mail303
相关产品推荐
相关产品推荐

