파이썬 DataFrame 관련 질문 드립니다.

조회수 1491회

파이썬에서 간단히 DataFrame의 데이터를 매핑하려고 합니다. 아래와 같이 M과 N DataFrame을 각각 생성하고,

import pandas as pd
M = { 'x': ['a', 'b', 'c'], 'y': ['1', '2', '3'] }
N = { 'i': ['3', '1', '2'] }
M = pd.DataFrame(M)
N = pd.DataFrame(N)

N의 i열의 특정 값과 동일한 값을 M의 y 열에서 찾은 후, 그와 대응하는(그와 같은 행에 있는) 값을 M의 x열에서 찾고 싶습니다. 예를 들어, N['i'][2]값('2')와 동일한 값이 M['y'][1]에 있으므로, 이에 대응하는 x열의 값, 즉 M['x'][1]값('b')를 찾는 것인데, 개별적으로는 아래와 같이 입력하면 'b'값을 얻을 수 있었습니다.

M['x'][N['i'][2]==M['y']]

그런데, 이것을 일괄적으로 처리하여 N의 j열에 저장하고 싶은데, 아래와 같이 작성하니 j열 값이 [NaN, a, Nan]으로 표시됩니다. 원하는 것은 [c, a, b]로 표시되는 것입니다.

N['j'] = ''
N['j'] = N.apply(lambda e: M['x'][e['i'] == M['y']], axis=1)

최종적으로 N의 j열에 아래와 같은 값을 저장하는 것이 목적입니다.

M - - N -
x y i j
a 1 3 c
b 2 1 a
c 3 2 b

어떻게 수정해야 제대로 동작할지 도움 부탁 드리겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • import pandas as pd
    M = { 'x': ['a', 'b', 'c'], 'y': ['1', '2', '3'] }
    N = { 'i': ['3', '1', '2'] }
    M = pd.DataFrame(M)
    N = pd.DataFrame(N)
    
    import string
    mappedData = dict(zip(map(str, range(1, 27)), string.ascii_lowercase)) # '1':'a' '2':'b' ... '26':'z'
    
    N['j'] = [mappedData[k] for k in N['i']]
    
    N
    Out[20]: 
       i  j
    0  3  c
    1  1  a
    2  2  b
    

    1이면 a 3이면 c 이므로 숫자를 키로 알파벳을 값으로 하는 딕셔너리를 만들고 그 딕셔너리를 이용해서 값을 알아내도 가능합니다.

    • 감사합니다. 초급자인데, 덕분에 딕셔너리를 생성하는 방법과 map 메서드에 대해 알게 되었습니다. 제가 궁극적으로 구현하고자 했던 것은 M 데이터를 외부 엑셀 파일에서 DataFrame으로 불러와서 매핑하는 것이어서, 설명주신 내용 참고하여 아래 답변과 같이 코드를 완성했습니다. (댓글에서는 마크다운 문법이 적용이 안되어 답변에 남겼습니다.) 알 수 없는 사용자 2017.4.29 22:59
  • import pandas as pd
    M = { 'x': ['a', 'b', 'c'], 'y': ['1', '2', '3'] }
    N = { 'i': ['3', '1', '2'] }
    M = pd.DataFrame(M)
    N = pd.DataFrame(N)
    
    mappedData = dict(zip(M['y'], M['x']))
    N['j'] = N['i'].map(mappedData) 
    

    결과값은 동일합니다. 다시 한번 도움 주셔서 감사합니다!

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)