熊猫合并给出错误输出

问题描述:

好吧 我已经经历了一些与此主题相关的博客 - 但我仍然遇到同样的问题。我有两个数据框。两者都有一个列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

我会使用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