匹配2个不同的数据框返回值,然后比较
问题描述:
我需要匹配这两个不同大小的数据框,获得匹配的字段,然后比较它是大还是小。匹配2个不同的数据框返回值,然后比较
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
的比赛是对ID1和ID2 DF完成,相比DF2的ID。尽管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中的170,000条记录相匹配。在这里,我比较了2列,但有4列我需要在DF中匹配。
我希望这是有道理的,因为效率现在也在考虑之中,合并数据帧超过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.cost的成本。他们被排除在外。
更正了我上面的例子。
任何想法?
答
我认为你可以replace
值列id
和id2
通过df2
与set_index
,然后apply
to_numeric
更换不号码NaN
。最后通过gt
与any
比较和使用boolean indexing
:
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
能'df2'也有在列''id' a4'?如果是这样,你会选择哪种成本,'a4'或'b1'? – IanS
是的'df2'也可以在'id'列中有'a4'。预期结果是来自df的任何记录,其中'df.id'或'df.id2'出现在'df2.id'中,并且如果df中的'cost'小于df2中的'cost'。 – BernardL