2016-09-19 4 views
3

두 데이터 프레임간에 간단한 병합을 시도하고 있습니다.pandas - 문자열 열에서 병합이 작동하지 않습니다 (버그?)

>>> df1.col1.dtype 
dtype('O') 
>>> df2.col2.dtype 
dtype('O') 

내가 이것을 사용하여 병합하려고 : 다음은 참여 키 문자열 두 개의 서로 다른 SQL 테이블에서 온

>>> merge_res = pd.merge(df1, df2, left_on='col1', right_on='col2') 
내부의 결과는 가입

먼저 나를 자극하는, 비어 이 교차로에있는 모든 항목이되지 않을 수도 :

>>> merge_res.shape 
(0, 19) 

을하지만 하나의 요소와 일치 할 때, 나는이 정말 이상한 행동을 참조하십시오.

# Pick random element in second dataframe 
>>> df2.iloc[5,:].col2 
'95498208100000' 

# Manually look for it in the first dataframe 
>>> df1[df1.col1 == '95498208100000'] 
0 rows × 19 columns 
# Empty, which makes sense given the above merge result 

# Now look for the same value as an integer 
>>> df1[df1.col1 == 95498208100000] 
1 rows × 19 columns 
# FINDS THE ELEMENT!?! 

그래서 열은 'object'dtype으로 정의됩니다. 그들을 문자열로 검색해도 결과가 산출되지 않습니다. 그것들을 정수로 검색하면 결과가 반환됩니다. 이것이 왜 병합이 위에 작동하지 않는지 이유입니다.

무슨 일이 벌어지고있는가요?

팬더는 df1.col1을 정수로 변환합니다. 이어도은 일치하는 문자열로 처리해야합니다.

는 (I이 사용하는 샘플 dataframes을 복제하려고했으나 작은 예를 들어, 나는이 문제가. 내가 더 설명 예를 찾을 수있는 방법에 대한 제안뿐만 아니라 감사하겠습니다 표시되지 않습니다.)

+1

보이는 (나는 ... strdtype을 지정하는 방법이 있었으면 좋겠어), 내가 먼저 그렇게'DF1의 [ '을 숫자 형 모든 값을 강요하려고 제안 이것은 int로 표현 될 수없는 str 값을 가지고 있음을 의미하므로 실패 할 수 있습니다. 그래서 다음과 같이 시도하십시오 :'df1 [ 'col1'] = pd.to_numeric (df1 [col1 '] = df1 ['col1 ' 'col1'], errors = 'coerce')'더프 값을 'NaN'으로 강제 변환합니다. – EdChum

+0

아, thanks @EdChum! 값의 일부는'int'로 변환 될 수 있지만 다른 것들은 변환 될 수 없습니다. 따라서 해당 열의 적절한 dtype은'str'이어야하지만 적절한 dtype이 아니기 때문에'object'가 작동 할 것이라고 생각했습니다. 하지만 수동으로 모든 것을'str'으로 변환하면 병합이 잘됩니다. 감사! – user1496984

+0

당신은 대답을 게시하고 며칠 만에이 질문에 답이 남아 있지 않으므로 자신의 대답을 수락 할 수 있습니까? 감사합니다 – EdChum

답변

7

문제는 object dtype이 오도 된 것입니다. 나는 모든 항목이 문자열이라는 것을 의미한다고 생각했습니다. 하지만 파일을 읽는 동안 팬더는 일부 요소를 int로 변환하고 나머지는 문자열로 남겨 두었습니다. 예상대로

>>> df1.col1 = df1.col1.astype(str) 
>>> df2.col2 = df2.col2.astype(str) 

그런 다음 병합 작동 :

이 솔루션은 모든 필드는 문자열이 있는지 확인했다.

당신이 당신의 열 dtypes을 혼합 한 것처럼

+0

이상한. 솔루션이 효과적이었습니다. 그러나 앞과 뒤의 두 변수 모두 해당 변수의 dtype은 'O'입니다. 당신이 암시하는 것처럼,이 객체 유형을 가진 두포가 더 있습니다. 그것이 더 투명 해졌길 바래요. –

관련 문제