Data Manipulation - concat, merge

신두다·2022년 4월 3일
0

공부노트

목록 보기
3/12

학습 목표

  • Pandas를 통해 데이터를 concat / merge 할 수 있다.


데이터를 분석할 때의 현실


현실에서 원하는 데이터는 한 곳에 모여있지 않고 이리저리 나뉘어져 있다. 관리적 측면과 성능적 측면 모두를 위해서 그런 건데, SQL을 공부해보기도 했고, 실제 전 회사에서 그런 형태를 많이 봤기 때문에 익숙한 개념이다.

  • 예를 들어, 회원, 상품, 주문 데이터를 쪼개서 보관하고 공통된 Key값을 통해 join을 해가며 데이터 분석을 해나간다. 만약 한 회원이 총 100번 주문을 했다고 했을 때, 한 데이터 셋에 모든 주문 정보, 회원 정보, 상품 정보가 합쳐져서 동일한 값이 중복되어 있는 것은 비효율적이다.

따라서 우리는 데이터 분석을 하며 여러 데이터를 불러와서 합치는 과정을 많이 하게 될 것이다.

이렇게 데이터를 합칠 때 쓰는 pandas 함수인 concat, merge에 대해서 알아보자.


Concat


기본 문법

pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
  • 예시) pd.concat([df1, df2])

concat은 '붙이는 것'이다.

붙이는 방향에 따라,

  • 두 개의 dataframe을 '위 아래로' 붙일 수도 있고, '옆에 가져다 붙일 수도 있다" (axis=)
    • axis = 0 (default): 아래로 붙인다.
    • axis = 1: 옆에 붙인다.

join = 파라미터

  • join = 'outer' (default): 합집합(Union) 기준
  • join = 'inner': 교집합(intersection) 기준
  • 합쳤을 때 dataframe에 없는 값은 NaN으로 채워진다.

examples
헷갈리기 쉬우니 예시를 살펴보자.

위 예시를 보면 index가 원래의 dataframe의 것을 유지하는 것을 볼 수 있다.

  • 그러면 분석할 때 어렵기 때문에 reset_index() 하기도 하고,
  • 만약 index가 기본인 '0, 1, 2..' 가 아니라 'a, b, c ..'와 같이 dataframe 생성 시 별도로 지정을 해주었었다면,
    • concat 파라미터에서 ignor_index =를 이용해 별도로 지정한 index를 유지한채 합칠지, 아니면 무시하고 기본인 '0, 1, 2..'로 바꿀지를 정할 수 있다.

(보다 자세한 예는 이 사이트를 참고했다)


그럼 .append() 랑 다른 것은 뭐냐?

  • 기능은 유사하지만, concat은 append의 모든 것 + a 를 할 수 있다고 생각하면 된다. (df1.appned(df2))
  • 익숙해지려면 그냥 concat을 기억하고 쓰는게 낫겠다.

Merge


기본 문법

DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
  • 예시) df.merge("붙일 내용", how = "(방법)", on ="(기준 feature)")

merge는 concat과 다르게 '공통된 부분을 기반으로' 합치는 것이 주된 용도이다.

how = ''의 종류

  • how = 'inner' (default)
    • 두 dataframe의 공통된 칼럼의 공통된 값이 있는 경우 그 열만 가져와 합친다.
  • how = 'outer'
    • 양쪽 값 모두 나오게 합친다. 없는 값은 NaN 처리 된다.
  • how = 'left'
    • 왼쪽 데이터 일단 다 가져오고, 오른쪽 데이터를 가져오는데 왼쪽에만 있고 오른쪽에 없으면 NaN 처리 된다.
    • how = 'right'는 반대다. SQL에서는 특별한 경우 아니면 left join만 하는데, 여기도 그렇게 생각해도 될 것 같다.

(구체적인 예시는 글 최하단의 영상을 참고할 것)


on, left_on, right_on

  • on= 을 안 적으면 pandas가 알아서 판단한다.
  • left_on, right_on의 경우 df1, df2에서 기준으로 하고 싶은 칼럼들의 명칭이 서로 다를 때, df1의 이 칼럼과 df2의 이 칼럼을 기준으로 해주세요~ 라는 의미다.

주의하자

  • 양쪽에 공통적으로 없는 칼럼으로 on=하면 Key Error가 난다. (칼럼명이 같아야 한다)
  • datatype이 다른 경우에도 error가 난다.

.join() 함수

  • merge는 join의 모든 것 + a를 할 수 있다.
  • df1.join(df2, on = 'ID', how = 'inner') 이런 식으로 쓸 수 있긴 한데, 역시 엥간하면 merge에 익숙해지는 게 편하겠다는 생각은 든다.

설명이 부족했다면 이 영상을 봐보는 것을 추천한다. 한 번에 정리가 될 것이다.

profile
B2B SaaS 회사에서 Data Analyst로 일하고 있습니다.

0개의 댓글