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

如何将DataFrame列名与另一DataFrame的列值对比并修正代码?

问题

需要对比DataFrame df 的列名与另一个DataFrame set_cols 中「Numbers」列的取值,找出df中不在set_cols['Numbers']范围内的列名,并生成指定格式的错误字典errors,期望每个错误条目格式为{'column': '列名', 'message': '列名 is an invalid column heading'}。现有代码无法适配该场景,原代码如下:

import pandas as pd

filename='template'
 
df= pd.DataFrame(columns=['firstName', 'lastName', 'state', 'Communication_Language__c',
       'country', 'company', 'email', 'industry', 'System_Type__c',
       'AccountType', 'customerSegment', 'Existing_Customer__c',
       'GDPR_Email_Permission__c','persons name'])

data= ['firstName', 'lastName', 'state', 'Communication_Language__c',
       'country', 'company', 'email', 'industry', 'System_Type__c',
       'AccountType', 'customerSegment', 'Existing_Customer__c',
       'GDPR_Email_Permission__c']

set_cols=pd.DataFrame(data, columns=['Numbers'])

errors= {}
errors[filename]={}

df_cols = df[list(df.columns)]
mask = df_cols.apply(lambda d: d.isin(set_cols[d.name]))
df_cols.mask(mask|df_cols.eq(' ')).stack()
for err_i, (r, v) in enumerate(df_cols.mask(mask|df_cols.eq(' ')).stack().iteritems()):
    errors[filename][err_i] = {"column": r[1],
                               "message": r + " is invalid column heading'}

修正后的代码与说明

直接简化逻辑,聚焦列名对比的核心需求,无需复杂的DataFrame操作,代码如下:

import pandas as pd

filename='template'
 
df= pd.DataFrame(columns=['firstName', 'lastName', 'state', 'Communication_Language__c',
       'country', 'company', 'email', 'industry', 'System_Type__c',
       'AccountType', 'customerSegment', 'Existing_Customer__c',
       'GDPR_Email_Permission__c','persons name'])

data= ['firstName', 'lastName', 'state', 'Communication_Language__c',
       'country', 'company', 'email', 'industry', 'System_Type__c',
       'AccountType', 'customerSegment', 'Existing_Customer__c',
       'GDPR_Email_Permission__c']

set_cols=pd.DataFrame(data, columns=['Numbers'])

# 初始化错误字典
errors = {filename: {}}

# 将有效列名转为集合,提升查询效率
valid_columns = set(set_cols['Numbers'])
# 获取df的全部列名
df_col_list = df.columns.tolist()

# 筛选无效列并构建错误条目
for err_idx, invalid_col in enumerate([col for col in df_col_list if col not in valid_columns]):
    errors[filename][err_idx] = {
        "column": invalid_col,
        "message": f"{invalid_col} is an invalid column heading"
    }

# 验证输出
print(errors)

关键改动说明

  • 去掉原代码中冗余的df_cols创建与复杂的mask、stack操作,直接针对列名列表进行对比,逻辑更直观
  • 用set存储有效列名,查询效率从O(n)提升至O(1),数据量大时优势明显
  • 修复原代码中字符串拼接的语法错误(原代码message字段的字符串未正确闭合)
  • 最终生成的errors字典完全符合预期格式,示例中会针对persons name列生成对应的错误条目

内容的提问来源于stack exchange,提问作者user20235106

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:35:33