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

如何使用Polars的group_by批量统计多列数据的覆盖类型频次?

Polars多列数据覆盖情况批量统计方案

问题场景

现有Polars DataFrame,所有列值介于0到1之间,分别代表无覆盖(0)、部分覆盖(0<值<1)、完全覆盖(1)。需要一次性统计所有列的三种覆盖类型出现次数,无需逐列执行。

示例输入DataFrame:

import polars as pl

df = pl.DataFrame({'a':[0.0,0.5,1.0,1.0],'b':[0,0,0,1]})

期望输出格式:

shape: (3, 3)
┌──────────┬─────┬─────┐
│ coverage ┆ a   ┆ b   │
│ ---      ┆ --- ┆ --- │
│ str      ┆ i64 ┆ i64 │
╞══════════╪═════╪═════╡
│ nothing  ┆ 1   ┆ 3   │
│ partial  ┆ 1   ┆ 0   │
│ complete ┆ 2   ┆ 1   │
└──────────┴─────┴─────┘

解决方案

通过长表转换→统一打标签→分组统计→宽表重构的流程实现批量处理,代码如下:

import polars as pl

df = pl.DataFrame({'a':[0.0,0.5,1.0,1.0],'b':[0,0,0,1]})

# 1. 将宽表转为长表,统一处理所有列
melted_df = df.melt(var_name="column", value_name="value")

# 2. 为每个值标记对应的覆盖类型
labeled_df = melted_df.with_columns(
    pl.when(pl.col("value") == 0)
      .then(pl.lit("nothing"))
      .when((pl.col("value") > 0) & (pl.col("value") < 1))
      .then(pl.lit("partial"))
      .otherwise(pl.lit("complete"))
      .alias("coverage")
)

# 3. 分组统计次数,再转成目标宽表格式,补全缺失值为0
result = (
    labeled_df.group_by(["column", "coverage"])
    .len()
    .pivot(index="coverage", columns="column", values="len")
    .fill_null(0)
    .sort("coverage")
)

print(result)

代码逻辑说明

  1. melt转换:把多列的宽表转为column(列名)和value(对应值)的长表,避免逐列重复编写逻辑;
  2. 统一打标签:用when条件判断,给所有列的数值统一标记覆盖类型;
  3. 分组统计+透视:按列名和覆盖类型分组计数,再通过pivot转回宽表,fill_null(0)补全不存在的覆盖类型(如b列无partial数据,填充为0),最后排序保证覆盖类型顺序符合预期。

内容的提问来源于stack exchange,提问作者chriss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:33:20