Pandas多列匹配多列表验证:状态被覆盖无法正确校验
Pandas多列校验状态生成问题解决
问题说明
要对DataFrame的freq、typ、category三列分别用指定列表做校验,生成综合的状态描述。但现有代码每次直接给status列赋值,导致前一次的校验结果被覆盖,没法得到完整的状态信息。
原数据与验证规则:
import pandas as pd data = pd.DataFrame({'freq': ['Dly', 'ad','Weekly ', 'XXX'], 'typ': ['TEST', 'A','TEST2', 'YYYY'], 'category': ['ACC', 'T','TEST3', 'ZZZZ'], 'id': ['1', '2','3', '4']}) # 各列的验证列表 freq_list = ['ad','annex','Qtr','Weekly'] type_list= ['A','B'] catry_list = ['T','C','ACC']
错误代码示例:
# 每次赋值都会覆盖之前的status值,最终只剩category的校验结果 data['status'] = data.apply(lambda x: x.typ in type_list, axis=1) data['status'] = data.apply(lambda x: x.freq in freq_list, axis=1) data['status'] = data.apply(lambda x: x.category in catry_list, axis=1)
解决方法
通过自定义函数一次性完成三列的校验,收集所有不匹配的字段,再生成对应的状态文本。另外注意处理freq列的首尾空格问题(比如第三行的Weekly 有多余空格,需要先清理才能匹配列表中的Weekly)。
完整实现代码:
import pandas as pd data = pd.DataFrame({'freq': ['Dly', 'ad','Weekly ', 'XXX'], 'typ': ['TEST', 'A','TEST2', 'YYYY'], 'category': ['ACC', 'T','TEST3', 'ZZZZ'], 'id': ['1', '2','3', '4']}) freq_list = ['ad','annex','Qtr','Weekly'] type_list= ['A','B'] catry_list = ['T','C','ACC'] def generate_status(row): # 清理freq列的首尾空格 cleaned_freq = row['freq'].strip() missing_fields = [] # 逐一校验各列 if cleaned_freq not in freq_list: missing_fields.append('freq') if row['typ'] not in type_list: missing_fields.append('typ') if row['category'] not in catry_list: missing_fields.append('category') # 根据缺失字段生成对应文本 if not missing_fields: return '' elif len(missing_fields) == 1: return f"{missing_fields[0]} 不在验证列表中" elif len(missing_fields) == 2: return f"{missing_fields[0]} 和 {missing_fields[1]} 不在验证列表中" else: return "freq、typ 和 category 均不在验证列表中" # 生成status列 data['status'] = data.apply(generate_status, axis=1) # 输出结果 print(data.to_string(index=False))
最终输出
freq typ category id status Dly TEST ACC 1 freq 和 typ 不在验证列表中 ad A T 2 Weekly TEST2 TEST3 3 typ 和 category 不在验证列表中 XXX YYYY ZZZZ 4 freq、typ 和 category 均不在验证列表中
内容的提问来源于stack exchange,提问作者kmr
相关产品推荐
相关产品推荐

