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

如何计算两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:18:24