[Basic] 데이터 정제 - 병합하기 concat, merge

고보·2024년 2월 2일

1 Concat

  • pd.concat([df1, df2, df3]): 2개 이상의 pandas 객체(일반적으로 데이터프레임)을 연결(concatenate).
    - pd.concat([df1, df2, df3], axis=1)행 또는 열 방향으로 결합 가능. axis=0이 행 방향으로 연결(default), axis=1이 열 방향으로 연결.
    전달받은 걸 따로 맞추는 작업 없이 그냥 순서대로 연결.
    ex1) 예를 들면, df1, 2, 3이 각각 0~3까지 index가 있고, 열 이름이 A~D로 일치한다.
    aixs=0으로 행 방향으로 붙이면, 열 이름 같은 것끼리 같이 붙인다. 행 인덱스는 0~3, 0~3, 0~3으로 index가 붙어서 총 12행이 된다.

    axis=1으로 열 방향으로 붙이면, 행 인덱스 일치하는 거 기준으로 그냥 붙인다. 열 이름은 A~D, A~D, A~D로 총 12열이 된다. (인덱스 숫자 같아보여도 .index해서 보면 다른 경우 있다)
  • pd.concat([df1, series]): df에 시리즈를 붙이면 그냥 새로운 열로 추가. 만약 이걸 같은 열 이름으로 맞추고 싶으면 Dataframe으로 바꿔서 붙이면 됨.
    ex2) 그냥 시리즈로 붙인 결과 vs 데이터프레임으로 바꿔서 붙인 결과

  • pd.concat([df1, df2, df3], ignore_index=True): ignore_index = True로 하면, 기존 index 무시하고 아예 새 index 할당. axis=1로 하면 열 이름 다 없애고 할당.
  • pd.concat([df1, df2, df3], join='inner'): 그냥 하면, 데이터프레임이 겹치지 않는 부분은 누락값으로 처리. 여기서 inner join으로 설정하면, 공통 열이 없으면 아예 빠짐.
    iner join, outer join 개념(oracle sql)
    여기선 셋 다 컬럼 이름이 겹치지 않으면 그냥 아무 열도 생기지 않음. 3개를 concat할 때 2개만 겹쳐도 안됨.



2 merge

o2o_merge = site.merge(visited_subset, left_on = 'name', right_on = 'site', how=)
o2o_merge
  • 기본적으로 inner join을 실행한다. merge를 붙이는 데이터프레임을 왼쪽으로 지정(여기선 site). 첫번째 인자에 붙일 데이터프레임을 지정.
  • left_on, right_on으로 붙일 열 이름을 지정. 둘 다 이름이 같으면 그냥 on도 가능.
  • 그 열에서 값이 일치하는 행끼리 합친다.
  • how=inner, outer, left(왼쪽 데이터 프레임에 있는 모든 행 결과 포함, 오른쪽과 일치하지 않으면 NaN 값), right으로 결합 방식 설정.

2-1 다대다 병합

ps = person.merge(survey, left_on = 'ident', right_on = 'person')
vs = visited.merge(survey, left_on = 'ident', right_on = 'taken')
ps_vs = ps.merge(vs, left_on=['quant'], right_on = ['quant'])
  • 여기서 ps의 quant 값을 count하면 rad 8, sal 8, temp 3개로 총 19개행.
    vs의 quant 값을 count하면 rad 9, sal 8, temp 4개로 총 21개 행.
  • 이 2개를 merge하면, rad끼리 모두 결합 89 = 72
    sal끼리 8
    8 = 64, temp 3*4 = 12.
    이렇게 같은 경우끼리 모두 결합되서 총 72 + 64 + 12로 148개 행이 나온다

2-2 조건이 많은 경우

ps = person.merge(survey, left_on = 'ident', right_on = 'person')
vs = visited.merge(survey, left_on = 'ident', right_on = 'taken')
ps_vs2 = ps.merge(vs, left_on=['ident', 'taken', 'quant', 'reading'],
        right_on=['person', 'ident', 'quant', 'reading'])
  • 이 경우 조건이 순서대로 모두 일치할 때만 결과가 나오고, 나머지는 모두 없어진다.

3 assert문

  • 코드가 의도한 대로 실행됐는지 확인. 조건이 True면 반환 없이 다음 코드 실행. 코드가 False면 AssertionError 발생 후 코드 멈춤.
    ex) assert 5 == 6 => 에러 뜬다
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글