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

按分组内出现频率最高的值替换DataFrame列值

实现方法

要实现按student分组,将每组内所有city替换为该组出现频率最高的城市(众数),可以用以下几种高效方法:

方法1:groupby + transform + mode(最简洁)

利用mode()直接获取分组的众数,通过transform将众数广播到分组的每一行:

import pandas as pd

df = pd.DataFrame({'student': list('AAABBBCCCC'),
                   'city': ['LA', 'LA', 'NY', 'DC', 'NY', 'NY', 'SF', 'SF', 'LA', 'SF'],
                   'score': [75, 27, 31, 22, 43, 20, 26, 40, 33, 20]})

# 替换city为分组众数
df['city'] = df.groupby('student')['city'].transform(lambda x: x.mode()[0])

print(df)

注:若分组存在多个众数(即多个city出现次数相同),x.mode()[0]会取第一个出现的众数,可根据需求调整索引。

方法2:预计算众数映射表再合并

先统计每个student对应的众数城市,再通过合并替换原city列:

# 生成student到众数city的映射表
city_mode_map = df.groupby('student')['city'].agg(lambda x: x.mode()[0]).reset_index(name='city')

# 合并并替换原city列
df = df.drop('city', axis=1).merge(city_mode_map, on='student')

print(df)

这种方法适合需要单独保留众数映射关系的场景。

方法3:groupby + transform + value_counts.idxmax

通过value_counts()统计频率,idxmax()取频率最高的city:

df['city'] = df.groupby('student')['city'].transform(lambda x: x.value_counts().idxmax())

print(df)

该方法与方法1逻辑类似,区别是通过频率统计获取最高频城市。

以上三种方法均可得到你需要的结果,其中方法1代码最简洁,是日常处理这类需求的首选。

内容的提问来源于stack exchange,提问作者Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:48:22