Python 在两个数据帧中找到匹配项并执行减法

Python 在两个数据帧中找到匹配项并执行减法,python,dataframe,pandas-groupby,Python,Dataframe,Pandas Groupby,基本上,我在这个结构中有两个数据帧,如何在d1和d2中找到具有相同“索引”、“名称”和“日期”的项,并对“ABS”执行减法(并将其放入d2中的新列或新数据帧中),如果未找到项,则将其标记为“未找到”。试过np.where但不起作用 提前谢谢。这是一个使用合并然后减去的有效解决方案 data1 = pd.DataFrame({'Index':['XX','XX','XX','YY','YY','XY'],'Name':['X1X','X1X','X3X','Y1Y','Y1Y','X1XY'],'

基本上,我在这个结构中有两个数据帧,如何在d1和d2中找到具有相同“索引”、“名称”和“日期”的项,并对“ABS”执行减法(并将其放入d2中的新列或新数据帧中),如果未找到项,则将其标记为“未找到”。试过np.where但不起作用


提前谢谢。

这是一个使用合并然后减去的有效解决方案

data1 = pd.DataFrame({'Index':['XX','XX','XX','YY','YY','XY'],'Name':['X1X','X1X','X3X','Y1Y','Y1Y','X1XY'],'Date'['2020/1','2020/1','2020/2','2020/2','2020/2','2020/3'],'ABS':[1,1,2,3,3,4]})
data2 = pd.DataFrame({'Index':['XX','XX','XX','YY','YY'],'Name':['X1X','X1X','X3X','Y1Y','Y1Y'],'Date':['2019/1','2020/1','2020/2','2020/3','2020/3'],'ABS':[1,1,2,3,3]})

d1=data1.groupby(['Index','Name','Date']).sum()
d2=data2.groupby(['Index','Name','Date']).sum()

尝试合并,然后进行计算
import pandas as pd
import numpy as np

# make the data
data1 = pd.DataFrame({'Index':['XX','XX','XX','YY','YY','XY'],'Name':['X1X','X1X','X3X','Y1Y','Y1Y','X1XY'],'Date':['2020/1','2020/1','2020/2','2020/2','2020/2','2020/3'],'ABS':[1,1,2,3,3,4]})
data2 = pd.DataFrame({'Index':['XX','XX','XX','YY','YY'],'Name':['X1X','X1X','X3X','Y1Y','Y1Y'],'Date':['2019/1','2020/1','2020/2','2020/3','2020/3'],'ABS':[5,5,6,9,8]})

# do an outer join
data3 = pd.merge(data1, data2, on=['Index', 'Name', 'Date'], how="outer")

# do the subtraction and make a new column, with NaN replaced by 'Not Found'
data3['abs_net'] = np.where((data3['ABS_x'] - data3['ABS_y']).isna(), 'Not Found', (data3['ABS_x'] - data3['ABS_y']))

# drop the two ABS columns
data3 = data3.drop(columns=["ABS_x", "ABS_y"])

# remove duplicate rows
data3 = data3.drop_duplicates()

# look at the result
data3
  Index  Name    Date    abs_net
0    XX   X1X  2020/1        0.0
2    XX   X3X  2020/2        0.0
3    YY   Y1Y  2020/2  Not Found
5    XY  X1XY  2020/3  Not Found
6    XX   X1X  2019/1  Not Found
7    YY   Y1Y  2020/3  Not Found