我浏览了一些与此主题相关的博客-但我仍然遇到相同的问题。我有两个数据框。两者都有一个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']


源具有160,000行,而查找具有大约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)


该代码有效-但显然它是BAD代码,需要很长时间。我可以对其进行多处理-但问题仍然存在。为什么合并失败?

谢谢你的帮助
Rgds

最佳答案

在这种情况下,我将使用map()方法:

首先在lookup DF中将“ X”设置为索引:

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


实际上,您的代码对于示例DF正常工作:

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是否相同

关于python - Pandas 合并给出错误的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40190625/

10-12 16:57