如何按分组提取DataFrame中出现频率最高的行?
解决方法:提取分组中最常出现的水果记录
嘿,我来帮你搞定这个问题!你已经用df.groupby('col1')['col2'].value_counts()拿到了分组后的水果计数,接下来只需要几步就能提取每组里的最大值记录啦~
第一步:把计数结果转成结构化的DataFrame
value_counts()返回的是一个带层级索引的Series,我们先把它转成普通DataFrame,并重命名计数列:
import pandas as pd # 还原你的原始DataFrame data = { 'col1': ['maria', 'eugene', 'eugene', 'maria', 'maria', 'eugene', 'maria'], 'col2': ['apple', 'apple', 'banana', 'apple', 'pear', 'banana', 'apple'] } df = pd.DataFrame(data) # 生成分组计数并转成DataFrame count_df = df.groupby('col1')['col2'].value_counts().reset_index(name='col3')
这时候count_df的结构是:
col1 col2 col3 0 maria apple 3 1 maria pear 1 2 eugene banana 2 3 eugene apple 1
第二步:提取每组的最大值记录
因为value_counts()默认会按计数降序排列,所以每组的第一条记录就是计数最多的那条。我们只需要按col1分组后取每组的第一行:
result = count_df.groupby('col1').head(1).reset_index(drop=True)
执行后你就能得到期望的结果:
col1 col2 col3 0 maria apple 3 1 eugene banana 2
额外补充:处理并列最大值的情况
如果某个人有多种水果的出现次数相同(比如maria的apple和pear都出现2次),上面的方法只会取第一个。如果需要保留所有并列的最大值记录,可以用transform来筛选:
# 筛选出每组中计数等于组内最大值的所有行 result = count_df[count_df.groupby('col1')['col3'].transform('max') == count_df['col3']].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者randbats
相关产品推荐
相关产品推荐

