2016-10-22 114 views
1

好吧 我已經經歷了一些與此主題相關的博客 - 但我仍然遇到同樣的問題。我有兩個數據框。兩者都有一個列X,其中有SHA2值。它包含十六進制字符串熊貓合併給出錯誤輸出

例(數據框查找)

X,Y 
000000000E000394574D69637264736F66742057696E646F7773204861726477,7 
0000000080000000000000090099000000040005000000000000008F2A000010,7 
000000020000000000000000777700010000000000020000000040C002004600,24 
0000005BC614437F6BE049237FA1DDD2083B5BA43A10175E4377A59839DC2B64,7 

例(數據幀的源)

X,Z 
000000000E000394574D69637264736F66742057696E646F7773204861726477,'blah' 
0000000080000000000000090099000000040005000000000000008F2A000010,'blah blah' 
000000020000000000000000777700010000000000020000000040C002004600,'dummy' 

所以我現在做

lookup['X'] = lookup['X'].astype(str) 
source['X'] = source['X'].astype(str) 
source['newcolumn'] = source.merge(lookup, on='X', how='inner')['Y'] 

消息源160000行和查找有大約500,000行。

現在,當操作完成後,我得到了newcolumn,但值是錯誤的。 我確定它們沒有從X的重複值中拾取,因爲在任何表中都沒有重複的X.

所以,這真的讓我感到很蠢,在我的現場系統中給了我很大的痛苦。任何人都可以提出什麼問題?

我現在已經取代了電話與

def getReputation(lookupDF,value,lookupcolumn,default): 
    lookupRows = lookupDF.loc[lookupDF['X']==value] 
    if lookupRows.shape[0]>0: 
     return lookupRows[lookupcolumn].values[0] 
    else: 
     return default 

source['newcolumn'] = source.apply(lambda x: getReputation(lookup,x['X'],'Y',-1),axis=1) 

此代碼的工作 - 但顯然它是錯誤代碼,並採取了可怕的很長一段時間。我可以對其進行多重處理 - 但問題依然存在。爲什麼合併失敗?

感謝您的幫助 RGDS

回答

3

我會使用map()方法在這種情況下: 'X'

第一組爲索引在lookup DF:

In [58]: lookup.set_index('X', inplace=True) 

In [59]: lookup 
Out[59]: 
                    Y 
X 
000000000E000394574D69637264736F66742057696E646F7773204861726477 7 
0000000080000000000000090099000000040005000000000000008F2A000010 7 
000000020000000000000000777700010000000000020000000040C002004600 24 
0000005BC614437F6BE049237FA1DDD2083B5BA43A10175E4377A59839DC2B64 7 

In [60]: df['Y'] = df.X.map(lookup.Y) 

In [61]: df 
Out[61]: 
                    X   Z Y 
0 000000000E000394574D69637264736F66742057696E646F7773204861726477  blah 7 
1 0000000080000000000000090099000000040005000000000000008F2A000010 blah blah 7 
2 000000020000000000000000777700010000000000020000000040C002004600  dummy 24 

其實你的代碼正在爲您的示例DFs正常工作:

In [68]: df.merge(lookup, on='X', how='inner') 
Out[68]: 
                    X   Z Y 
0 000000000E000394574D69637264736F66742057696E646F7773204861726477  blah 7 
1 0000000080000000000000090099000000040005000000000000008F2A000010 blah blah 7 
2 000000020000000000000000777700010000000000020000000040C002004600  dummy 24 

因此,檢查兩個DF中的X列中是否有相同的數據和dtype

+0

嗨 - 感謝您的評論 - 我將檢查地圖並儘快找回。 – Run2

+0

這就像一個魅力。謝謝。不 - 我沒有改變別的。所以合併有一些問題。可能是我應該報告一個錯誤。是的,我確信在合併之前dtype和data是相同的。它適用於這幾行 - 但不是真正的數據集,這些數據集非常大。 – Run2