如何用Pandas通过参考DataFrame验证数据组合有效性并删除无效行
问题场景
现有两个Pandas DataFrame:
待检查的DataFrame df3:
import pandas as pd df3 = pd.DataFrame({ "FACHEXPERTISE": ["AQ01", "AQ03", "AQ05"], "ZUSATZBEZEICHNUNG": ["ZF14", "ZF45", "ZF13"] })
存储所有合法组合的DataFrame QUALI:
QUALI = pd.DataFrame({ "FACHEXPERTISE": ["AQ01", "AQ01", "AQ01"], "ZUSATZBEZEICHNUNG": ["ZF15", "ZF30", "ZF40"] })
需求是检查df3中每一行的FACHEXPERTISE和ZUSATZBEZEICHNUNG组合是否在QUALI的合法组合中,删除不合法的行。
之前尝试的代码报错str对象没有.isin方法,原因是apply遍历FACHEXPERTISE列时,每个x是单个字符串值,而isin是Pandas Series/DataFrame的方法,字符串对象没有该方法,因此报错。
可行解决方案
方法1:内连接筛选(推荐,高效简洁)
通过merge的内连接特性,只保留两个DataFrame中匹配的行:
# 提取合法组合并去重(避免重复匹配) valid_pairs = QUALI[["FACHEXPERTISE", "ZUSATZBEZEICHNUNG"]].drop_duplicates() # 内连接获取合法行 df3_valid = df3.merge(valid_pairs, on=["FACHEXPERTISE", "ZUSATZBEZEICHNUNG"], how="inner")
方法2:元组集合匹配
将两行的列组合转为元组,直接用isin判断是否在合法元组集合中:
# 生成合法组合的元组列表 valid_tuples = list(QUALI[["FACHEXPERTISE", "ZUSATZBEZEICHNUNG"]].itertuples(index=False, name=None)) # 筛选合法行 df3_valid = df3[df3.apply(tuple, axis=1).isin(valid_tuples)]
方法3:分组映射判断(适合大数据量)
先对QUALI按FACHEXPERTISE分组,构建合法值映射字典,再逐行判断:
# 构建映射:FACHEXPERTISE → 对应的合法ZUSATZBEZEICHNUNG集合 valid_map = QUALI.groupby("FACHEXPERTISE")["ZUSATZBEZEICHNUNG"].apply(set).to_dict() # 生成筛选掩码 mask = df3.apply( lambda row: row["FACHEXPERTISE"] in valid_map and row["ZUSATZBEZEICHNUNG"] in valid_map[row["FACHEXPERTISE"]], axis=1 ) # 获取合法行 df3_valid = df3[mask]
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

