2016-06-08 43 views
1

我需要匹配这两个不同大小的数据框,获得匹配的字段,然后比较它是大还是小。匹配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的成本。他们被排除在外。

更正了我上面的例子。

任何想法?

+0

能'df2'也有在列''id' a4'?如果是这样,你会选择哪种成本,'a4'或'b1'? – IanS

+0

是的'df2'也可以在'id'列中有'a4'。预期结果是来自df的任何记录,其中'df.id'或'df.id2'出现在'df2.id'中,并且如果df中的'cost'小于df2中的'cost'。 – BernardL

回答

2

我认为你可以replace值列idid2通过df2set_index,然后applyto_numeric更换不号码NaN。最后通过gtany比较和使用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 
+0

如果df.id和df.id2与df2.id匹配,那么成本必须小于df2中的成本时,这也适用吗? – BernardL

+0

你觉得更小的长度?如果是的话,我认为它可以很好地工作。 – jezrael

+0

也许我对'.isin'的理解不是很好。如果我们看看'df.id2',即使它在'df2.id'中,结果也不应该为它返回一个记录,因为它的代价更大。类似于'df.cost <= df2.cost'的地方希望有道理。 – BernardL

相关问题