판다스 엑셀 질문하고싶습니다!

조회수 691회

A와 B라는 워크시트가 있고 둘다 시트 설정은 따로 없습니다.

A는 B에서 나올 수 있는 모든 데이터를 첫번째 열에 기록한 상태이고 두번째 열에는 같은 행인 첫번째 열의 출력되었으면 하는 값이 들어있습니다.

(A의 첫번째 열은 무조건 정수가 적혀있지만 타입이 문자열인지 정수인지까지는 알 수 없고, 두번째 열에는 무조건 문자열로 되어있습니다)

B의 첫번째 열에는 A의 첫번째 열에 있는 데이터가 각 행마다 무작위로 들어가 있고 두번째 열에는 아무것도 적혀있지 않습니다. (B의 경우도 마찬가지로 첫번째 열에 적힌 숫자의 타입이 문자열인지 정수형인지는 알수가 없으며 A와 같은 데이터를 지목하더라도 둘이 같은 자료형 타입이 아닌 경우도 있습니다.)

A.xlsx 예시

1일
2이
3삼
4사
5오

B.xlsx 예시

3
1
1
2
4
1

이럴 경우 B를 불러와

  • 첫번째 열 각 행에 A의 첫번째 열에서 같은 값이 있는지 찾은 후
  • 있다면 해당 행 두번째 열을 복사한 후
  • B의 각 행에 두번째 열에 복사한 값을 두번째 열에 출력하고 저장하는 것 까지 해야합니다.

위 예시 자료를 이용할 경우 모든 작업이 끝나면 B는 아래와 같은 상태가 되어있길 원합니다.

3삼
1일
1일
2이
4사
1일

어떤식으로 해야 할지 느낌은 이해가 되는데 구현을 어떤식으로 해야할지 구체적인 방법이 안떠오르네용. 질문을 처음 올려보는거라 제대로 질문을 하고있는건지 모르겠지만 판다스를 이용한 적절한 방법이 있을까요?

1 답변

  • >>> import pandas as pd
    
    >>> a = pd.DataFrame({"A":[1, 2, 3, 4, 5], "B":list("일이삼사오")})
    >>> b = pd.DataFrame({"C":[ 2, 3, 3, 1, 1, 4 ]})
    >>> print(a.to_markdown())
    |    |   A | B   |
    |---:|----:|:----|
    |  0 |   1 | 일  |
    |  1 |   2 | 이  |
    |  2 |   3 | 삼  |
    |  3 |   4 | 사  |
    |  4 |   5 | 오  |
    >>> print(b.to_markdown())
    |    |   C |
    |---:|----:|
    |  0 |   2 |
    |  1 |   3 |
    |  2 |   3 |
    |  3 |   1 |
    |  4 |   1 |
    |  5 |   4 |
    >>> b.merge(a, left_on="C", right_on="A")
       C  A  B
    0  2  2  이
    1  3  3  삼
    2  3  3  삼
    3  1  1  일
    4  1  1  일
    5  4  4  사
    >>> c = b.merge(a, left_on="C", right_on="A")
    >>> c
       C  A  B
    0  2  2  이
    1  3  3  삼
    2  3  3  삼
    3  1  1  일
    4  1  1  일
    5  4  4  사
    >>> c.drop(columns="A")
       C  B
    0  2  이
    1  3  삼
    2  3  삼
    3  1  일
    4  1  일
    5  4  사
    
    
    >>> a.to_records(index=False)
    rec.array([(1, '일'), (2, '이'), (3, '삼'), (4, '사'), (5, '오')],
              dtype=[('A', '<i8'), ('B', 'O')])
    >>> mapping = { e[0]:e[1] for e in a.to_records(index=False) }
    >>> mapping
    {1: '일', 2: '이', 3: '삼', 4: '사', 5: '오'}
    >>> b
       C
    0  2
    1  3
    2  3
    3  1
    4  1
    5  4
    >>> b["D"] = b["C"].map(mapping)
    >>> print(b.to_markdown())
    |    |   C | D   |
    |---:|----:|:----|
    |  0 |   2 | 이  |
    |  1 |   3 | 삼  |
    |  2 |   3 | 삼  |
    |  3 |   1 | 일  |
    |  4 |   1 | 일  |
    |  5 |   4 | 사  |
    

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

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

(ಠ_ಠ)
(ಠ‿ಠ)