You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:25:58