如何统计Polars DataFrame所有列中各值的出现次数?
解决Polars全表值计数的问题
报错原因
你之前的代码报错是因为value_counts()会为每一列返回一个包含(值、计数)的小DataFrame,这些小DataFrame的行数各不相同。而select要求所有列的长度必须一致,因此触发了长度不匹配的错误。
优雅解决方案
要统计全表所有值的出现次数,最优方式是先把所有列堆叠成单列(长格式),再统一统计:
场景1:统计所有出现过的值的总次数
import polars as pl # 将宽表转为长格式,所有值存入一列 long_df = df.melt(id_vars=[], value_name="value") # 统计所有值的出现次数 total_counts = long_df["value"].value_counts(sort=True) print(total_counts)
场景2:指定目标值,未出现的值显示0(匹配你的示例格式)
如果需要像示例那样,对特定值进行统计(即使值未出现也要显示计数0),可以用左连接填充空值:
import polars as pl # 定义需要统计的目标值 target_values = [1, 2, 3, 4] # 转换为长格式 long_df = df.melt(id_vars=[], value_name="value") # 统计总次数并匹配目标值,填充空计数为0 result = ( long_df["value"] .value_counts() .with_columns(pl.col("value").cast(pl.Int64)) # 确保值类型一致 .join(pl.DataFrame({"value": target_values}), on="value", how="right") .fill_null(0) .sort("value") ) # 按你的格式输出 for value, count in result.iter_rows(): print(f"{value}: {count}")
说明
melt(id_vars=[])会把所有列都转为行,将原本的多列值合并到一列中,这样就能用一次value_counts()完成全表统计。- 左连接+
fill_null(0)可以保证所有目标值都出现在结果中,未出现的值计数填充为0。
内容的提问来源于stack exchange,提问作者C0untV
相关产品推荐
相关产品推荐

