You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:19:57