如何在Polars中检测非唯一行与缺失值并生成合规报告
使用Polars实现双数据校验并生成统一报告
两种可行方案
方案一:分别生成校验报告后用vstack合并
这种方式逻辑清晰,可直接复用你已有的缺失值检测代码,步骤如下:
- 检测ID、table、value_a组合重复的违规行
import polars as pl # 假设你的数据集为df,若原数据无index列,先添加自增索引 df = df.with_row_index("index") # 找出存在重复的组合 duplicate_groups = df.group_by(["ID", "table", "value_a"])\ .agg(pl.count().alias("count"))\ .filter(pl.col("count") > 1) # 关联回原数据,生成重复行的违规报告 duplicate_report = df.join(duplicate_groups, on=["ID", "table", "value_a"], how="inner")\ .select( pl.col("index"), pl.lit("ID、table、value_a组合值重复").alias("warning") )
复用你已有的缺失值检测代码生成报告
假设你现有代码生成的缺失值报告为missing_report,需保证其结构包含index和warning两列。合并两个报告
final_report = duplicate_report.vstack(missing_report) # 可选:按index排序,方便按行号查看违规信息 final_report = final_report.sort("index")
方案二:单流程一次性生成双校验报告
通过添加标记列,一次性筛选出两类违规行并整理成报告,适合追求处理效率的场景:
# 先添加自增索引(若原数据无index列) df = df.with_row_index("index") # 添加重复标记和缺失值标记列 df_with_flags = df.with_columns( # 标记组合重复的行 is_duplicate=pl.col(["ID", "table", "value_a"]).is_duplicated(), # 标记mandatory为"M"时存在缺失值的行(可指定检查列,这里默认检查所有列) is_missing=pl.when(pl.col("mandatory") == "M") .then(pl.any_horizontal(pl.all().is_null())) .otherwise(False) ) # 筛选违规行并生成统一报告 final_report = df_with_flags.filter(pl.col("is_duplicate") | pl.col("is_missing"))\ .select( pl.col("index"), pl.when(pl.col("is_duplicate") & pl.col("is_missing")) .then(pl.lit("ID、table、value_a组合重复且必填项缺失")) .when(pl.col("is_duplicate")) .then(pl.lit("ID、table、value_a组合值重复")) .otherwise(pl.lit("mandatory为M的行存在缺失值")) .alias("warning") )
注意事项
- 缺失值检测若需指定特定检查列,将代码中的
pl.all()替换为pl.col(["指定列1", "指定列2"])即可。 - 若原数据已有业务意义的
index列,可跳过添加自增索引的步骤。
内容的提问来源于stack exchange,提问作者Horseman
相关产品推荐
相关产品推荐

