如何在Polars DataFrame中筛选唯一值少于100的字符串列?
问题分析与解决方法
你的代码问题所在
第一段代码报错原因:
(pl.col(pl.String)) & (pl.all().n_unique() < 100)的逻辑不成立。pl.col(pl.String)是选中所有字符串列,而pl.all().n_unique() <100是对所有列计算唯一值数量后生成布尔值,两者属于不同维度的操作,无法用&直接组合来筛选列。第二段代码未达到预期的原因:
df.select(pl.all().n_unique() <100)返回单行布尔DataFrame是正常行为——n_unique()是聚合函数,在select中使用时,Polars会把每列的所有行聚合成一个结果(这里是该列唯一值数量是否小于100的布尔值),但这是创建新列的操作,不是筛选列的操作。
正确实现方式
方式一:分步筛选(新手友好,逻辑清晰)
# 提取所有字符串类型的列名 string_cols = df.select(pl.col(pl.String)).columns # 筛选出唯一值数量少于100的列 valid_cols = [col for col in string_cols if df[col].n_unique() < 100] # 选中目标列 filtered_df = df.select(valid_cols)
方式二:用Polars表达式API简洁实现
filtered_df = df.select([ col for col in pl.col(pl.String) if col.n_unique() < 100 ])
或者用filter方法:
filtered_df = df.select( pl.col(pl.String).filter(lambda col: col.n_unique() < 100) )
内容的提问来源于stack exchange,提问作者pietz
相关产品推荐
相关产品推荐

