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
中,结果也不会返回它的记录,因为成本更高。类似wheredf.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