2016-06-08 40 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

相關問題