如何计算两个DataFrame之间的相对差异(百分比)?
获取两个DataFrame的相对差异
问题描述
给定两个DataFrame df1 和 df2,可以通过以下代码获取它们的绝对差异:
df3 = df1.compare(df2)
请问如何获取它们之间的相对差异?原本尝试用pct_change函数,但该函数无法接收DataFrame作为输入。
解决方案
要计算相对差异,核心是基于绝对差异除以基准值(可选择df1或df2作为基准),以下是两种实用方法:
方法1:基于compare结果转换
先通过compare拿到绝对差异的结构化结果,再除以对应基准值得到相对差异:
# 获取绝对差异的compare结果 abs_diff = df1.compare(df2) # 提取df2中对应差异位置的基准值(若要以df1为基准,替换为df1) base_vals = df2.loc[abs_diff.index, abs_diff.columns.get_level_values(1)] # 计算相对差异,结果结构与compare输出一致 rel_diff = abs_diff.div(base_vals.values, axis=0)
输出的rel_diff保留了compare的双列结构(self对应df1的相对变化,other对应基准值的关联展示),值为(df1元素 - df2元素)/df2元素的相对变化率。
方法2:手动计算后筛选差异
先全局计算相对变化率,再筛选出存在差异的部分:
# 计算全局相对差异(以df2为基准) rel_diff_full = (df1 - df2) / df2 # 筛选出df1与df2不相等的位置 diff_mask = df1.ne(df2) # 只保留有差异的行和列 rel_diff = rel_diff_full[diff_mask].dropna(how='all').dropna(axis=1, how='all')
关键注意点
- 若基准值存在0,会导致计算出无穷大或NaN,可提前用
df.replace(0, 1e-9)替换避免报错 - 如需百分比形式,可将结果乘以100:
rel_diff * 100 - 基准选择灵活:以
df1为基准时,公式改为(df2 - df1)/df1
内容的提问来源于stack exchange,提问作者user16004728
相关产品推荐
相关产品推荐

