如何使用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)
代码逻辑说明
- melt转换:把多列的宽表转为
column(列名)和value(对应值)的长表,避免逐列重复编写逻辑; - 统一打标签:用
when条件判断,给所有列的数值统一标记覆盖类型; - 分组统计+透视:按列名和覆盖类型分组计数,再通过
pivot转回宽表,fill_null(0)补全不存在的覆盖类型(如b列无partial数据,填充为0),最后排序保证覆盖类型顺序符合预期。
内容的提问来源于stack exchange,提问作者chriss
相关产品推荐
相关产品推荐

