如何用Python(Pandas)迭代实现多Excel文件多列季度数据比对
解决方案
前置修正
先修正原有代码的小问题:q1未做索引重置,和q2-q4的格式不一致,会导致比对逻辑出错,先调整q1的定义:
q1 = df[df.quarters == 1].reset_index(drop=True)
是否需要定义函数?
需要,函数封装可以大幅降低重复代码量,后续新增比对列、调整比对规则只需要修改函数内部逻辑即可,不需要重复修改4次代码。
具体实现方案
第一步:抽离配置项
把所有可变内容(季度数据、对应测试文件路径、需要比对的列)都统一配置,后续调整不需要改动核心逻辑:
# 配置1:季度数据与对应测试文件的映射关系,后续改路径直接修改这里即可 quarter_config = [ (q1, 'from_biontech.xlsx'), (q2, 'from_astrazeneca.xlsx'), (q3, 'from_sputnik.xlsx'), (q4, 'from_moderna.xlsx') ] # 配置2:需要比对的列名,后续新增比对列直接往列表里加即可 compare_cols = ['date_column', 'efficacy', 'composition', 'testgroups'] # 存储所有季度比对结果的容器,用key(q1/q2/q3/q4)即可调用对应结果 quarter_results = {}
第二步:封装比对函数
完全兼容你原有使用.equals支持空值比对的逻辑:
def compare_quarter_data(local_df, test_file_path, compare_cols): # 读取对应测试方的Excel文件 test_df = pd.read_excel(ospath(test_file_path)) # 遍历所有要比对的列自动生成比对结果 for col in compare_cols: is_col_same = local_df[col].equals(test_df[col]) local_df[f'compare_{col}'] = 'True' if is_col_same else 'False' return local_df
第三步:循环执行比对
for idx, (quarter_df, test_path) in enumerate(quarter_config, start=1): quarter_key = f'q{idx}' # 用.copy()避免修改原始的q1/q2/q3/q4数据,不需要的话可以去掉 quarter_results[quarter_key] = compare_quarter_data(quarter_df.copy(), test_path, compare_cols)
结果使用说明
处理完成后,你可以通过quarter_results['q1']、quarter_results['q2']的方式获取对应季度的比对结果,和你原来单独定义q1/q2/q3/q4变量的使用方式完全一致。
可选优化(按需使用)
如果你需要逐行比对差异,而不是判断整列是否完全一致,只需要修改函数内的比对逻辑即可:
# 逐行比对,相同行返回True,不同返回False,同样支持空值比较 is_same_series = local_df[col].eq(test_df[col]) local_df[f'compare_{col}'] = is_same_series.astype(str)
内容的提问来源于stack exchange,提问作者Acerace.py
相关产品推荐
相关产品推荐

