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

如何在两个不同的Pandas DataFrame中对匹配列的Value值做减法?

问题描述

有两个DataFrame,构造代码如下:

import pandas as pd
from datetime import timedelta

df_t = pd.DataFrame(columns = ['BusinessUtc','Horizon','EvaluationUtc','BZ','Value'])
date = pd.to_datetime('2023-01-01 00:00:00')
day = timedelta(days = 1)
date1 = date
date2 = date - day
date3 = date2 - day
date4 = date3 - day
Horizon = 'D-1'
BZ = ['NO4','NO4','NO4','NO4','NO1','NO1','NO1','NO1','NO5','NO5','NO5','NO5']
Values = [1301.681, 1271.479,1460.043, 1302.357,3412.155, 3611.549, 4042.706, 3756.527,1462.085, 4042.706, 3756.527,1462.085]
df_t['EvaluationUtc'] = [date1,date2,date3,date4,date1,date2,date3,date4,date1,date2,date3,date4]
df_t['BusinessUtc'] = date
df_t['Horizon'] = Horizon
df_t['BZ'] = BZ
df_t['Value'] = Values

df2 = df_t.drop(index = [1,2,3,5,6,7,9,10,11])

需求:根据匹配的BZ列,将df_t中每行的Value值减去df2中对应BZ的Value值,结果存入新DataFrame。例如,df_t中所有NO4的Value都减去df2里NO4的Value,其他BZ同理。

解决方案

方法1:使用merge关联后计算

先提取df2中BZ对应的基准值,再与df_t关联,最后计算差值:

# 提取df2中BZ对应的基准值,重命名列避免冲突
df2_ref = df2[['BZ', 'Value']].rename(columns={'Value': 'Ref_Value'})

# 按BZ列关联两个DataFrame
merged_df = df_t.merge(df2_ref, on='BZ', how='left')

# 计算差值并生成结果DataFrame
result_df = merged_df.copy()
result_df['Value_Diff'] = result_df['Value'] - result_df['Ref_Value']

# 查看结果
print(result_df)

方法2:使用map映射基准值

先构建BZ到基准值的字典,再通过映射匹配后计算差值:

# 构建BZ到对应基准值的字典
bz_ref_dict = df2.set_index('BZ')['Value'].to_dict()

# 复制原DataFrame并计算差值
result_df = df_t.copy()
result_df['Value_Diff'] = result_df['Value'] - result_df['BZ'].map(bz_ref_dict)

# 查看结果
print(result_df)

结果说明

两种方法都会生成包含原始所有列和新增差值列Value_Diff的新DataFrame。以NO4为例,df_t中NO4的四个Value分别减去df2里NO4的1301.681,得到的差值为:0、-30.202、158.362、0.676,其他BZ的计算逻辑完全一致。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:33:09