如何在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'))的问题在于:
max('count')不是合法的用法,max()需要针对分组后的列调用,不能直接传字符串参数。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
相关产品推荐
相关产品推荐

