如何在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列后合并对齐
- 定义平移量
shift_amount(正数向右移,负数向左移),对目标DataFrame的x列做平移:
shift_amount = 2 # 向右平移2个单位 f2_shifted = f2.copy() f2_shifted['x'] = f2_shifted['x'] + shift_amount
- 用
merge按x列对齐两个DataFrame,仅保留x值匹配的行:
merged = pd.merge(f1, f2_shifted, on='x', suffixes=('_f1', '_f2'))
- 计算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'})
- 绘制包含平移后曲线的对比图:
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
相关产品推荐
相关产品推荐

