Pandas:将数据列中出现次数少于10次的稀有值替换为‘RARE’
解决Pandas DataFrame稀有值替换问题
嘿,我来帮你搞定这个问题!你原来的思路方向是对的,但在调用value_counts()的时候没指定具体列,而且在lambda里重复计算频次的做法效率很低,还容易出问题。下面给你几种靠谱的实现方式:
方法一:预计算频次+字典映射(直观高效)
先一次性计算好目标列的频次,再创建映射字典来替换值,这样避免重复计算,性能更好:
# 第一步:计算LocationNormalized列各值的出现频次 loc_freq = df["LocationNormalized"].value_counts() # 第二步:创建映射规则:出现次数<10的替换为"RARE",否则保留原值 rare_mapping = {location: "RARE" if count < 10 else location for location, count in loc_freq.items()} # 第三步:应用映射到目标列 df["LocationNormalized"] = df["LocationNormalized"].map(rare_mapping)
方法二:用mask方法一行搞定(简洁优雅)
Pandas的mask()方法可以直接把满足条件的元素替换成指定值,代码更简洁:
loc_freq = df["LocationNormalized"].value_counts() df["LocationNormalized"] = df["LocationNormalized"].mask( df["LocationNormalized"].map(loc_freq) < 10, "RARE" )
这里mask()的逻辑是:如果第一个参数的条件为True(即该值的出现次数<10),就把对应位置的元素替换成第二个参数"RARE",否则保持原值。
为什么你的原代码有问题?
你原来写的df.value_counts()[x]有两个问题:
df.value_counts()是对整个DataFrame的行组合计数,而你需要的是单列的频次,应该写成df["LocationNormalized"].value_counts()[x];- 在
apply()的lambda里每次都调用value_counts(),会重复计算几百/几千次,数据量大的时候会非常慢,预计算频次再复用才是正确的做法。
内容的提问来源于stack exchange,提问作者anon_swe
相关产品推荐
相关产品推荐

