Python 匹配2个不同的数据帧以返回值,然后进行比较

Python 匹配2个不同的数据帧以返回值,然后进行比较,python,pandas,dataframe,Python,Pandas,Dataframe,我需要匹配这两个不同大小的数据帧,得到匹配的字段,然后比较它是大还是小 df = pd.DataFrame({'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 'id': ['a1', 'a2', 'a3', 'a4', 'a5'], 'id2': ['', '', '', 'b1', 'b2'], 'cost':[1,2,3,4,5]}, columns = ['first_name

我需要匹配这两个不同大小的数据帧,得到匹配的字段,然后比较它是大还是小

df = pd.DataFrame({'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
        'id': ['a1', 'a2', 'a3', 'a4', 'a5'],
        'id2': ['', '', '', 'b1', 'b2'],
        'cost':[1,2,3,4,5]}, columns = ['first_name', 'id','id2','cost'])
df

    first_name  id  id2 cost
0   Jason   a1      1
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4
4   Amy     a5  b2  5

df2 = pd.DataFrame({'id': ['a1', 'a2', 'a3','b1','b2','b3'],'cost':[1,2,3,4,6,6]},columns = ['id','cost'])
df2


id  cost
0   a1  1
1   a2  2
2   a3  3
3   b1  4
4   b2  3
5   b3  6
预期结果是:

first_name  id  id2 cost
0   Jason   a1      1
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4
与id上的df2相比,id1和id2上的df正在进行匹配。虽然b2在id中,但它不包括在内,因为df2中匹配的成本大于df中的成本

我尝试了以下几点:

df[(df['id'].isin(df2['id']) == True) | (df['id2'].isin(df2['id']) == True)]

    first_name  id  id2 cost
0   Jason   a1      1
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4
4   Amy a5  b2  5
我似乎很难同时比较成本并排除那些比匹配成本小的成本

这是一个例子,我正在处理的工件在df中有180万条记录,并与df2中的17万条记录相匹配。这里我比较了2列,但在df中有4列需要匹配

我希望这是有意义的,因为效率现在也在考虑之中,将数据帧合并4次是没有意义的

另一个例子:

df

    first_name  id  id2 cost
0   Jason   a1      7
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4
4   Amy     a5  b2  8

df2


id  cost
0   a1  6
1   a2  2
2   a3  3
3   b1  4
4   b2  6
5   b3  6
在上面的例子中

预期结果将是:

first_name  id  id2 cost
1   Molly   a2      2
2   Tina    a3      3
3   Jake    a4  b1  4
所以a1、a2、a3、a4、b1和b2匹配,但因为a1和b2中的成本大于df2中的成本。他们被排除在外

也纠正了我上面的例子

有什么想法吗?

我想你可以用
df2
替换列
id
id2
中的值,然后将非数字替换为
NaN
。最后与比较和使用:


df2
id
中是否也有
a4
?如果是这样,您会选择哪种成本,
a4
b1
?是的
df2
也可以在
id
列中选择
a4
。预期结果是来自df的任何记录,
df.id
或出现在
df2.id
中的
df.id2
,如果df中的
cost
小于df2中的
cost
。这是否也适用于df.id和df.id2与df2.id匹配的成本必须特别小于df2中成本的情况?您认为长度更小吗?如果是的话,我认为它可以很好地工作。也许我对
.isin
的理解不太好。如果我们看一下
df.id2
,即使它在
df2.id
中,结果也不会返回它的记录,因为成本更高。类似where
df.cost的内容进行了更正,很抱歉我已经为此工作了几个小时。我们可能已经在同一时间进行了更新。很抱歉如果我们用它来建造
df=pd.DataFrame({'first_name':['Jason'、'Molly'、'Tina'、'Jake'、'Amy']、'id':['a1'、'a2'、'a3'、'a4'、'a5']、'id2'、'a4'、'a5']、'id2'、'cost'])
用于df和
df2=pd.DataFrame({'id':['a1'、'a2'、'a3'、'b1'、'b2'、'b3'、'6']、'b3'],columns=['id','cost'])
结果似乎不是预期的。同样,在匹配id的特定成本后,基于匹配的成本,成本必须更小。
mask = (~((df[['id','id2']].replace(df2.set_index('id')['cost'])
                        .apply(pd.to_numeric, errors='coerce'))
                        .gt(df.cost, axis=0)).any(1) )


print (mask)
0     True
1     True
2     True
3     True
4    False
dtype: bool

print (df[mask])
  first_name  id id2  cost
0      Jason  a1        10
1      Molly  a2         2
2       Tina  a3         3
3       Jake  a4  b1     4