You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:42:53