如何确保指定值集合内的每个值在pandas DataFrame每行中仅出现一次
你现有实现存在一处逻辑错误:return True 的缩进层级错误,只会校验第一行数据就返回结果,不会执行后续行的校验逻辑。
更简洁高效的向量化实现方案如下,完全避免Python层的逐行遍历,数据量越大性能优势越突出:
import pandas as pd def check(data, values): # 过滤出待校验的值,其他值替换为空 filter_df = data.where(data.isin(values), pd.NA) # 逐行对比非空唯一值数量和非空值总数量,全相等则校验通过 return (filter_df.nunique(axis=1) == filter_df.count(axis=1)).all()
测试验证:
VALUES = [1, 2] df_no = pd.DataFrame( { "a": [1, 2], "b": [1, 2], } ) df_yes = pd.DataFrame( { "a": [1, 2], "b": [2, 4], "c": [3, 1], } ) print(check(df_no, VALUES)) # 输出 False print(check(df_yes, VALUES)) # 输出 True
实现逻辑说明:
- 第一步先把所有不属于待校验集合的元素替换为空值,排除无关元素的干扰
- 第二步按行统计两个值:非空唯一值的数量、非空值的总数量。如果某行两个值不相等,说明该行内存在待校验集合的重复值
- 最后用
all()判断所有行都满足校验条件,是则返回True,否则返回False
内容的提问来源于stack exchange,提问作者baxx
相关产品推荐
相关产品推荐

