如何在两个不同的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
相关产品推荐
相关产品推荐

