如何用Pandas.groupby按指定列分组,获取对应最大值的目标列数据
Pandas分组提取每组最大值对应行的实现
明确:完全可以通过Pandas的groupby方法实现需求,以下是两种实用方案:
先构造示例DataFrame(方便复现测试)
import pandas as pd data = [ ["AR", "Aisles", "ex_1", 12.78], ["AR", "Aisles", "ex_2", 11.28], ["AR", "Aisles", "ex_3", 11.96], ["AR", "Favorites", "ex_1", 12.78], ["AR", "Favorites", "ex_2", 12.28], ["AR", "Favorites", "ex_3", 13.96], ["BR", "Favorites", "ex_1", 11.2], ["BR", "Favorites", "ex_2", 10.28], ["BR", "Favorites", "ex_3", 10.96], ] df = pd.DataFrame(data, columns=["COUNTRY_CODE", "PDP_SOURCE", "TREAT_SLIT", "ATC_METRIC"])
方案1:groupby + idxmax(高效优先)
通过idxmax获取每组中ATC_METRIC最大值对应的行索引,再提取原表对应行:
# 获取每组最大值的行索引 max_row_indices = df.groupby(["COUNTRY_CODE", "PDP_SOURCE"])["ATC_METRIC"].idxmax() # 提取目标行并重置索引 result_df = df.loc[max_row_indices].reset_index(drop=True)
执行后得到的结果完全符合预期:
| COUNTRY_CODE | PDP_SOURCE | TREAT_SLIT | ATC_METRIC |
|---|---|---|---|
| AR | Aisles | ex_1 | 12.78 |
| AR | Favorites | ex_3 | 13.96 |
| BR | Favorites | ex_1 | 11.2 |
方案2:groupby + apply(支持多最大值场景)
如果组内存在多个相同的ATC_METRIC最大值,这种方法会保留所有对应行:
result_df = df.groupby(["COUNTRY_CODE", "PDP_SOURCE"], group_keys=False).apply( lambda group: group[group["ATC_METRIC"] == group["ATC_METRIC"].max()] ).reset_index(drop=True)
两种方案按需选择即可,单最大值场景下idxmax的执行效率更高。
内容的提问来源于stack exchange,提问作者Juan Jose Vargas Estevez
相关产品推荐
相关产品推荐

