두 데이터 프레임간에 간단한 병합을 시도하고 있습니다.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
을 정수로 변환합니다. 이어도은 일치하는 문자열로 처리해야합니다.
보이는 (나는 ...
str
의dtype
을 지정하는 방법이 있었으면 좋겠어), 내가 먼저 그렇게'DF1의 [ '을 숫자 형 모든 값을 강요하려고 제안 이것은 int로 표현 될 수없는 str 값을 가지고 있음을 의미하므로 실패 할 수 있습니다. 그래서 다음과 같이 시도하십시오 :'df1 [ 'col1'] = pd.to_numeric (df1 [col1 '] = df1 ['col1 ' 'col1'], errors = 'coerce')'더프 값을 'NaN'으로 강제 변환합니다. – EdChum아, thanks @EdChum! 값의 일부는'int'로 변환 될 수 있지만 다른 것들은 변환 될 수 없습니다. 따라서 해당 열의 적절한 dtype은'str'이어야하지만 적절한 dtype이 아니기 때문에'object'가 작동 할 것이라고 생각했습니다. 하지만 수동으로 모든 것을'str'으로 변환하면 병합이 잘됩니다. 감사! – user1496984
당신은 대답을 게시하고 며칠 만에이 질문에 답이 남아 있지 않으므로 자신의 대답을 수락 할 수 있습니까? 감사합니다 – EdChum