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

如何在Pandas中按id分组,保留每组count最大值对应的brand?

解决按ID分组保留Count最高Brand的问题

嗨,我来帮你搞定这个需求~你的思路是对的,但之前的代码写法有问题,我给你两种简单可行的实现方法,还会解释为什么原来的代码跑不通。

首先先还原你的数据集方便测试:

import pandas as pd

data = pd.DataFrame({
    'Id': [1, 2, 2, 3, 4, 5, 5],
    'brand': ['Audi', 'BWM', 'FORD', 'AUDI', 'BMW', 'Audi', 'FORD'],
    'count': [3, 5, 3, 7, 2, 4, 3]
})

方法1:用groupby + idxmax()定位最大值行

这是最直观的方法,通过idxmax()找到每组中count值最大的行的索引,再提取对应数据:

# 获取每组count最大值对应的行索引
max_count_indices = data.groupby('Id')['count'].idxmax()
# 提取目标行并筛选需要的列
result = data.loc[max_count_indices, ['Id', 'brand']].reset_index(drop=True)
# 统一brand为大写(匹配你期望的结果格式)
result['brand'] = result['brand'].str.upper()

print(result)

运行后就能得到你想要的输出:

Id brand
0   1  AUDI
1   2   BMW
2   3  AUDI
3   4   BMW
4   5  AUDI

解释:

  • groupby('Id')['count'].idxmax():对每个ID分组后,找出该组内count值最大的那一行的索引。
  • data.loc[max_count_indices]:通过索引定位到这些行,再筛选Id和brand列。
  • 最后用str.upper()统一品牌名的大小写,解决你原始数据里Audi/AUDI、BWM/BMW的大小写不一致问题。

方法2:先排序再分组取首行

另一种思路是先把数据按count降序排列,这样每个ID的第一行就是count最大的记录,再分组取首行:

# 按count降序排序,确保每组最大count的行排在最前面
sorted_data = data.sort_values('count', ascending=False)
# 按ID分组后取每组第一行,再筛选列
result = sorted_data.groupby('Id').first()[['brand']].reset_index()
# 统一大小写
result['brand'] = result['brand'].str.upper()

print(result)

这个方法和方法1的结果完全一致,适合数据量不大的场景。

为什么你之前的代码无法运行?

data.groupby('id')['brand'].where(max('count'))的问题在于:

  1. max('count')不是合法的用法,max()需要针对分组后的列调用,不能直接传字符串参数。
  2. where()方法需要接收一个布尔条件(比如判断某行的count是否等于组内最大值),但你没有正确构建这个条件逻辑。

如果想用where的思路实现,也可以这么写(不过不如前面两种简洁):

result = data.groupby('Id').apply(lambda x: x[x['count'] == x['count'].max()][['Id', 'brand']]).reset_index(drop=True)
result['brand'] = result['brand'].str.upper()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:07:42