如何在Pandas中按name分组并提取sec列出现次数最多的值
提取Pandas分组中出现次数最多的元素
原始数据
先构造示例数据用于复现场景:
import pandas as pd data = { 'name': ['emp1', 'emp1', 'emp1', 'emp2', 'emp2', 'emp2', 'emp2'], 'sec': ['a', 'a', 'b', 'a', 'b', 'c', 'c'] } df = pd.DataFrame(data)
解决方案
这里提供几种高效方法直接得到目标结果,也包含基于你已有的分组计数的后续处理方案:
方法1:用value_counts+idxmax直接取高频元素
对每个name分组后的sec列做频率统计,idxmax会直接返回频率最高的元素:
result = df.groupby('name')['sec'].apply(lambda x: x.value_counts().idxmax()).reset_index(name='sec')
方法2:利用mode(众数)获取高频元素
众数本身就是分组内出现次数最多的元素,直接调用mode即可(若存在多个众数,取第一个结果):
result = df.groupby('name')['sec'].apply(lambda x: x.mode()[0]).reset_index(name='sec')
方法3:基于你已有的分组计数结果转换
如果你想基于df.groupby(['name','sec']).size()的结果继续处理,可按以下步骤:
# 将计数结果转为带列名的DataFrame count_df = df.groupby(['name', 'sec']).size().reset_index(name='count') # 按name分组,筛选出每组中count最大的行,再保留目标列 result = count_df.groupby('name').apply(lambda x: x.loc[x['count'].idxmax()]).reset_index(drop=True)[['name', 'sec']]
最终结果
执行任意方法后,都会得到你需要的格式:
name sec 0 emp1 a 1 emp2 c
内容的提问来源于stack exchange,提问作者Ramu Sompalli
相关产品推荐
相关产品推荐

