如何将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
相关产品推荐
相关产品推荐

