如何在Pandas中基于rating最大频次对brand分组去重?
解决方案
你之前的两种方法都没命中需求:
df.groupby(["brand",'rating']).max().reset_index()是按品牌+评分的组合分组,结果仍会保留同一品牌的多条记录,没实现品牌去重;df.drop_duplicates(subset=['brand'], keep='last')只是保留每个品牌的最后一行,完全没考虑评分的频次。
下面是几种能得到预期结果的方法:
方法1:用value_counts取频次最高值
按品牌分组后,对每个组的rating做频次统计,取频次最高的那个值:
import pandas as pd df = pd.DataFrame({ 'brand': ['Yum Yum', 'Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie', 'Cup','Pack'], 'rating': [1, 1, 0, 1, 0, 0, 1, 0]}) # 分组后取每个品牌rating的最高频次值 result = df.groupby('brand')['rating'].agg(lambda x: x.value_counts().idxmax()).reset_index() print(result)
输出结果:
brand rating 0 Cup 1 1 Indomie 0 2 Pack 0 3 Yum Yum 1
方法2:直接用众数mode
因为rating是二元字段,众数就是出现次数最多的值,用mode方法更简洁:
result = df.groupby('brand')['rating'].agg(pd.Series.mode).reset_index() print(result)
这个方法的输出和预期完全一致。
方法3:先统计频次再筛选
如果需要查看频次的话,可以先计算每个品牌-评分组合的出现次数,再按品牌筛选出频次最高的行:
# 计算每个brand-rating组合的出现次数 counts = df.groupby(['brand', 'rating']).size().reset_index(name='count') # 按品牌分组,保留count最大的行 result = counts.loc[counts.groupby('brand')['count'].idxmax(), ['brand', 'rating']] print(result)
内容的提问来源于stack exchange,提问作者Chetan Govindaswamy
相关产品推荐
相关产品推荐

