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

如何在x值匹配时计算两个DataFrame的y列差异(含X轴平移场景)

问题描述

有两个包含x、y列的DataFrame f1和f2,原本当二者x值一致时,可通过abs(f1.y-f2.y)计算y列的绝对差异并绘图,原始代码如下:

import pandas as pd
import matplotlib.pyplot as plt

f1 = pd.DataFrame({'x': range(1, 6), 'y': range(10, 0, -2)})
f2 = pd.DataFrame({'x': range(1, 6), 'y': range(10, 5, -1)})
f_diff = pd.DataFrame({'x': range(1, 6), 'y': abs(f1.y-f2.y)})

plt.style.use('default')
fig, axs = plt.subplots(figsize=(10, 5), facecolor='w', edgecolor='k')

axs.plot(f1.x, f1.y, color='orange')
axs.plot(f2.x, f2.y, color='red')
axs.plot(f_diff.x, f_diff.y, color='black')

现在需要对其中一个DataFrame沿X轴左右平移(施加X轴向量变换)后,重新计算x值匹配位置的y列绝对差异,希望得到更高效的解决方案,而非直接平移y值。

高效解决方案

核心思路是:先对目标DataFrame的x列做平移变换,再通过合并或索引重排对齐两个DataFrame的x值,最后计算对应位置的y差异。这种方法比手动平移y值更严谨,尤其适合x值非连续或数据量较大的场景。

方法1:平移x列后合并对齐

  1. 定义平移量shift_amount(正数向右移,负数向左移),对目标DataFrame的x列做平移:
shift_amount = 2  # 向右平移2个单位
f2_shifted = f2.copy()
f2_shifted['x'] = f2_shifted['x'] + shift_amount
  1. 用merge按x列对齐两个DataFrame,仅保留x值匹配的行:
merged = pd.merge(f1, f2_shifted, on='x', suffixes=('_f1', '_f2'))
  1. 计算y列的绝对差异并整理成差异DataFrame:
f_diff = merged.assign(y_diff=lambda df: abs(df['y_f1'] - df['y_f2']))[['x', 'y_diff']]
f_diff = f_diff.rename(columns={'y_diff': 'y'})
  1. 绘制包含平移后曲线的对比图:
plt.style.use('default')
fig, axs = plt.subplots(figsize=(10, 5), facecolor='w', edgecolor='k')

axs.plot(f1.x, f1.y, color='orange', label='f1')
axs.plot(f2_shifted.x, f2_shifted.y, color='red', label='f2 (shifted)')
axs.plot(f_diff.x, f_diff.y, color='black', label='y diff')
axs.legend()
plt.show()

方法2:用reindex实现对齐(适合连续x值场景)

如果x是连续的数值序列,可以用reindex快速对齐平移后的x轴,省略合并步骤:

shift_amount = -1  # 向左平移1个单位
# 生成平移后的x索引(与f1的x值对应)
shifted_x = f1['x'] + shift_amount
# 重排f2的索引,获取平移后x位置对应的y值,缺失值按需填充
f2_aligned = f2.set_index('x').reindex(shifted_x).reset_index()
# 计算绝对差异
f_diff = pd.DataFrame({
    'x': f1['x'],
    'y': abs(f1['y'] - f2_aligned['y'].fillna(0))  # 缺失值可替换为0或其他默认值
})

方案优势

  • 避免手动调整y值时的索引错误,尤其当x值非连续或数据量大时,内置函数能自动处理对齐逻辑
  • 利用pandas的优化函数(merge/reindex),比循环或手动赋值的运行效率更高
  • 代码逻辑清晰,平移与对齐步骤分离,便于后续维护和修改

内容的提问来源于stack exchange,提问作者Michał Darowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:45:28