如何用Polars将列中出现次数少于X次的值替换为指定值?
解决Polars中替换低频类别为"other"的问题
问题分析
你的Pandas代码逻辑是先统计列a的类别出现次数,再将出现次数少于50的类别替换为"other"。但Polars中不能直接在表达式里使用unique_counts()(这是Series方法,非表达式函数),导致你的尝试报错或结果不符。
正确实现方法
方法一:窗口函数(简洁直观)
利用窗口函数计算每个类别的出现次数,再通过when/then/otherwise进行替换:
df = df.with_columns( pl.when(pl.col("a").count().over(pl.col("a")) < 50) .then("other") .otherwise(pl.col("a")) .alias("a") )
- 逻辑:
pl.col("a").count().over(pl.col("a"))会为每行计算对应a类别的总出现次数,之后判断该次数是否小于50,满足则替换为"other",否则保留原类别。
方法二:分组统计+左连接(大数据场景更高效)
先单独统计类别计数,再通过左连接匹配到原表,最后完成替换:
# 统计每个类别的出现次数 counts = df.group_by("a").agg(pl.count().alias("cnt")) # 左连接+替换+清理临时列 df = df.join(counts, on="a", how="left").with_columns( pl.when(pl.col("cnt") < 50).then("other").otherwise(pl.col("a")).alias("a") ).drop("cnt")
- 优势:分组统计后仅保留唯一类别与计数,再通过连接匹配,在数据量极大时比窗口函数更节省计算资源。
与Pandas逻辑的对应
两种方法均与你原Pandas代码逻辑一致:
- 先获取每个类别的出现次数
- 筛选出次数≥50的类别
- 将不在此范围内的类别替换为"other"
内容的提问来源于stack exchange,提问作者JuanPy
相关产品推荐
相关产品推荐

