Python 在两个数据帧中找到匹配项并执行减法
基本上,我在这个结构中有两个数据帧,如何在d1和d2中找到具有相同“索引”、“名称”和“日期”的项,并对“ABS”执行减法(并将其放入d2中的新列或新数据帧中),如果未找到项,则将其标记为“未找到”。试过np.where但不起作用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'],'
提前谢谢。这是一个使用合并然后减去的有效解决方案
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