Polars:如何统计两指定列均空/均非空的行计数及占比
Polars实现两列均空/均非空的行统计与占比计算
需要实现类似以下SQL的分组统计功能:
SELECT Field_A ,COUNT(*) as Row_Count ,SUM(CASE WHEN FIELD_B IS NULL AND FIELD_C IS NULL THEN 1 ELSE 0 END) as Both_Null_Count
即按指定列分组后,统计每组的总行数,以及两列均为空或均已填充的行数,进而计算占比。
原代码问题分析
使用(pl.col(...) & pl.col(...)).count()会统计该布尔列的总行数(无论值为True/False),因此结果会和Row_Count完全一致,导致三列输出数值相同。
正确实现代码
df_all_cols = df_all_cols.group_by(lineage_fields)\ .agg( pl.len().alias('Row_Count'), # 统计两列均为空的行数 (pl.col('TRACKING').is_null() & pl.col('ORDER NUMBER').is_null()).sum().alias('Both_Null_Count'), # 统计两列均非空的行数 (pl.col('TRACKING').is_not_null() & pl.col('ORDER NUMBER').is_not_null()).sum().alias('Both_NotNull_Count'), # 可选:计算均空行的占比 ((pl.col('TRACKING').is_null() & pl.col('ORDER NUMBER').is_null()).sum() / pl.len()).alias('Both_Null_Ratio'), # 可选:计算均非空行的占比 ((pl.col('TRACKING').is_not_null() & pl.col('ORDER NUMBER').is_not_null()).sum() / pl.len()).alias('Both_NotNull_Ratio') )
代码说明
pl.len():直接获取分组后的总行数,对应SQL中的COUNT(*)(condition).sum():Polars中布尔值True等价于1,False等价于0,sum会累加所有符合条件(值为True)的行,完全对应SQL中SUM(CASE ...)的逻辑- 占比计算:用符合条件的行数除以总行数,即可得到目标行的占比
内容的提问来源于stack exchange,提问作者DixieFlatline
相关产品推荐
相关产品推荐

