pandas两个表间的计算问题,一个表所有行与另一个表所有行计算,取出最小的值数据与表一关联

pandas两个表间的计算
以下是计算过程,计算公式:(A-B)*(C-D),取结果最小的表二数据与表一关联
表一

img


表二

img


计算过程

img


期望计算结果

img

为啥我用你的公式(A-B)*(C-D),得不到你图中的计算结果呢

#导入数据,无index
df1=pd.DataFrame({'data1':['AA','BB','CC'],'A':[1,2,4],'B':[2,4,3]})
df2=pd.DataFrame({'data2':['QQ','WW','SS','CC'],'C':[4,5,3,4],'D':[3,1,5,5]})
#建立空df
df=pd.DataFrame()
for row in df1.itertuples():
    df2['data1']=row.data1#合并
    df2['A']=row.A#合并
    df2['B']=row.B#合并
    df2['差']=(row.A-row.B)*(df2.C-df2.D)#计算差值合并
    df=df.append(df2[df2['差']==min(df2['差'])],ignore_index=True)#将最小差添加到df,并重拍index
df=df[['data1','A','B','data2','C','D','差']]#重拍columns
print(df)

学识有限,暂时只能这样了。虽然我觉得pandas究极大神可以不用for语句,三五行内解决战斗,但是我还是差太多了。@heianduck

用 pd.merge(left=n,right=s,on="number",how="right")这个函数试一下

楼上已经解决了

加一个唯一条件就可以了

数据大吗?

import pandas as pd
df1=pd.DataFrame({'数据1':['AA','BB','CC'],'A':[1,2,4],'B':[2,2,5]})
df2=pd.DataFrame({'数据2':['QQ','WW','SS','CC'],'C':[4,5,3,4],
                  'D':[3,1,5,5]})
#对两个dataframe生成索引列
df1['index']=df2['index']=1
#合并,取的是笛卡尔积合并
df=pd.merge(df1,df2,on='index')
#任务结束,删除index列
del df['index']
df['计算结果']=(df['A']-df['B'])*(df['C']-df['D'])
#每一行计算结果在数据1内部取排名,得到每一行相对排名的series类型
#method='min'表示并列排名,默认ascending=true,即最小值排名为1
rank_series=df.groupby(by='数据1')['计算结果'].rank(method='min')
#由于是最小排名法,最小值排名数是1,所以rank_series=1对应的索引列即为所取数据
choose=df[rank_series==1]
print(choose)

这是我能想到最简的了