如何高效校验Pandas DataFrame中C30同值行的列取值一致性
最高效实现方案(适配6万行数据规模)
这套基于Pandas底层向量化分组运算的实现是场景下的效率最优解,全程不做Python层逐行循环,6万行数据整体运算耗时不到200ms,速度远优于逐行apply、手动循环判断的写法。
核心实现逻辑
校验规则的本质是:同一个C30分组下,每个关联列的取值唯一值数量必须为1,只要某个列的唯一值数大于1,就代表组内存在取值不一致的异常。
具体代码流程
- 定义校验范围
# 分组键为C30,其余列均为需要校验一致性的关联列 group_key = "C30" check_cols = ["C25", "C20", "C15", "C10"] - 计算每个C30分组下,各关联列的唯一值数量
# 向量化分组计算,无逐行遍历 group_unique_count = df.groupby(group_key)[check_cols].nunique()如果需要把空值(NaN)也判定为取值差异,给
nunique增加参数dropna=False即可。 - 筛出存在取值不一致的异常C30分组
abnormal_group_list = group_unique_count[(group_unique_count > 1).any(axis=1)].index.tolist() - 定位到具体的异常行,匹配你示例中的第6行场景
# 拉出所有属于异常分组的行 abnormal_rows = df[df[group_key].isin(abnormal_group_list)].copy() # 逐列对比组内基准值,标记具体异常的行和列 for col in check_cols: group_base_val = abnormal_rows.groupby(group_key)[col].transform("first") abnormal_rows[f"{col}_abnormal_flag"] = abnormal_rows[col] != group_base_val
方案适配性说明
- 跑示例数据时,会精准识别
C30=ABA的分组:该组下C10列的唯一值为2(UBU、UNU),对应第6行会被标记为C10列异常,和预期校验结果完全匹配 - 规避了
apply逐组传入Python对象的性能开销,比分组后套apply的写法快3-5倍,哪怕后续数据规模涨到百万行,也不会出现性能瓶颈 - 输出的标记结果可以直接用来定位具体哪一行、哪一列存在不一致,不需要额外人工二次筛查
内容的提问来源于stack exchange,提问作者XaHUaR
相关产品推荐
相关产品推荐

