DataFrame分组后获取组内计数最大值及对应最频繁元素方法
解决DataFrame分组统计频次并添加最大频次及对应元素列的问题
你之前的代码使用transform("max")是获取分组内目标列的数值最大值,而非元素出现次数的最大值,这和你的需求不符。下面提供两种可靠的解决方案:
方法一:先统计频次再合并(高效适配大数据量)
import pandas as pd # 构造示例数据 data = { 'A': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b'], 'B': ['d', 'd', 'd', 'd', 'd', 'b', 'b', 'b'], 'C': ['b', 'b', 'b', 'a', 'a', 'c', 'c', 'd'] } df = pd.DataFrame(data) # 1. 按指定列分组,统计目标列的元素频次 freq_df = df.groupby(['A', 'B'])['C'].value_counts().reset_index(name='count') # 2. 筛选每组中频次最高的记录 max_freq = freq_df.groupby(['A', 'B']).apply( lambda x: x[x['count'] == x['count'].max()] ).reset_index(drop=True) # 3. 重命名列并合并回原DataFrame max_freq = max_freq.rename(columns={'C': 'E', 'count': 'F'}) result = df.merge(max_freq, on=['A', 'B'], how='left')[['A', 'B', 'F', 'E']] print(result)
输出结果:
A B F E 0 a d 3 b 1 a d 3 b 2 a d 3 b 3 a d 3 b 4 a d 3 b 5 b b 2 c 6 b b 2 c 7 b b 2 c
方法二:使用transform结合自定义函数(代码简洁直观)
import pandas as pd # 构造示例数据 data = { 'A': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b'], 'B': ['d', 'd', 'd', 'd', 'd', 'b', 'b', 'b'], 'C': ['b', 'b', 'b', 'a', 'a', 'c', 'c', 'd'] } df = pd.DataFrame(data) # 自定义函数:返回分组内的最大频次和对应元素 def get_max_freq(group): counts = group.value_counts() max_count = counts.max() most_common = counts.idxmax() return pd.Series([max_count, most_common], index=['F', 'E']) # 应用函数并添加新列 df[['F', 'E']] = df.groupby(['A', 'B'])['C'].transform(get_max_freq) # 选择需要的列 result = df[['A', 'B', 'F', 'E']] print(result)
可选:处理多众数场景
如果分组内存在多个元素出现次数相同且均为最大值,可修改自定义函数返回列表形式的结果:
def get_max_freq(group): counts = group.value_counts() max_count = counts.max() most_common = counts[counts == max_count].index.tolist() return pd.Series([max_count, most_common], index=['F', 'E'])
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

