2016-10-22 3 views
1

Ok 이 주제와 관련하여 블로그를 읽었지만 여전히 동일한 문제가 발생합니다. 두 개의 데이터 프레임이 있습니다. 두 가지 모두 SHA2 값을 가진 열 X를가집니다. 그것은 16 진수 문자열을 포함합니다.팬더가 잘못된 출력을 병합합니다.

예 (Dataframe 조회)

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

예 (Dataframe 원)

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) 

이 코드는 작동으로 전화를 대체했다. 나는 그것을 다중 처리 할 수 ​​있지만 질문은 여전히 ​​남아있다. 병합이 실패한 이유는 무엇입니까? 당신의 도움에 대한

감사 RGDS

나는이 경우 map() 방법을 사용하는 것

답변

3

:

사실
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 

코드 다음 lookup DF의 지표로 'X'

첫 세트 샘플 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이 있는지 확인하십시오.

+0

안녕하세요. 그 의견에 감사드립니다.지도를 확인하고 최대한 빨리 알려 드리겠습니다. – Run2

+0

매력처럼 작동했습니다. 감사. 그리고 아니오 - 나는 다른 것을 바꾸지 않았습니다. 그래서 병합에 약간의 문제가 있습니다. 버그를보고해야 할 수도 있습니다. 그리고 네, 병합 전에 dtype과 데이터가 똑같은지 확인합니다. 이 몇 줄에서 작동하지만 꽤 큰 실제 데이터 세트에서는 작동하지 않습니다. – Run2