如何逐单元格遍历两个同结构DataFrame并执行比较逻辑
逐单元格比较DataFrame并执行对应函数的实现方法
假设你有两个结构完全一致的DataFrame df1 和 df2,下面是几种高效实现需求的方法:
方法一:使用numpy向量化函数(推荐)
先定义处理单个单元格比较结果的函数,再用np.vectorize将其转为可批量处理的向量化函数:
import numpy as np import pandas as pd # 自定义单元格处理逻辑 def process_cell(val1, val2): if val1 == val2: # 相等时的操作示例 return f"EQUAL:{val1}" else: # 不等时的操作示例 return f"DIFF:{val1}→{val2}" # 转为向量化函数,实现批量处理 vectorized_process = np.vectorize(process_cell) # 应用到两个DataFrame,生成结果 result_df = pd.DataFrame(vectorized_process(df1, df2), columns=df1.columns, index=df1.index)
方法二:利用布尔掩码分别处理
先生成标记单元格是否相等的布尔掩码,再针对不同区域执行操作:
# 生成相等/不等的布尔掩码 mask_equal = df1 == df2 mask_diff = ~mask_equal # 初始化结果DataFrame,填充相等单元格的处理结果 result_df = df1[mask_equal].applymap(lambda x: f"EQUAL:{x}") # 填充不等单元格的处理结果 result_df[mask_diff] = df1[mask_diff].astype(str) + "→" + df2[mask_diff].astype(str) result_df[mask_diff] = result_df[mask_diff].applymap(lambda x: f"DIFF:{x}")
方法三:逐单元格遍历(仅小数据量可用)
如果数据量极小,也可以直接遍历每个单元格,但这种方法效率极低,不推荐大数据场景使用:
result_df = df1.copy() for idx in df1.index: for col in df1.columns: val1 = df1.at[idx, col] val2 = df2.at[idx, col] if val1 == val2: result_df.at[idx, col] = f"EQUAL:{val1}" else: result_df.at[idx, col] = f"DIFF:{val1}→{val2}"
说明:DataFrame.compare仅用于识别并展示两个DataFrame的差异,无法直接支持自定义函数执行,因此需要通过上述方法实现需求。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

