按分组内出现频率最高的值替换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
相关产品推荐
相关产品推荐

