티스토리 뷰
1. 목표
각기 다른 두개 이상의 DataFrame을 하나로 병합 (Join, Merge) 하여 결과 집합으로 만들어낸다.
Inner Join, Outer Join, Left Join, Right Join이 존재.
데이터의 구조와 문제에 맞게 적용한다.
실전에서 생기는 상황에 대한 적용을 학습한다.
Inner Join
Dataframe 간 조인 조건을 만족하는 행 (교집합)을 합치는 것
>key 값이 A,B 모두에 존재해야 병합 가능
>일치하는 키 값이 없다면 결과 테이블에 포함 X
일대일 병합
a,b,c 컬럼과 c,d 컬럼이 있다면
a,b,c,d 컬럼이 된 병합 데이터프레임이 된다.
이때 c 컬럼은 결과 수가 같아야 한다.
일대다 병합
만약 C 컬럼의 결과 수가 다르다면?
A | B | C |
A1 | B1 | C1 |
A2 | B2 | C2 |
A3 | B3 | C3 |
+
C | D |
C1 | D1 |
C1 | D2 |
C1 | D3 |
C2 | D4 |
결과
A | B | C | D |
A1 | B1 | C1 | D1 |
A1 | B1 | C1 | D2 |
A1 | B1 | C1 | D3 |
A2 | B2 | C2 | D4 |
C3가 있는 걸럼은 빠지고, 결과가 나타난다.
이때 개수가 많다면, 값이 있는 행이 반복된다. (위 표에서는 A1,B1이 반복되었다.)
Outer Join
조건에 부합하지 않는 행까지 포함시켜 결합한다(합집합)
>key 값이 한쪽에만 있어도 결합 가능
>정보가 없는 쪽은 결측 처리(NaN)
>양쪽 Dataframe의 모든 정보를 하나로 묶어서 가져온다.
A | B | C |
A2 | B2 | C2 |
A3 | B3 | C3 |
A4 | B4 | C4 |
+
C | D |
C1 | D1 |
C2 | D2 |
C4 | D4 |
C5 | D5 |
결과
A | B | C | D |
NaN | NaN | C1 | D1 |
A2 | B2 | C2 | D2 |
A3 | B3 | C3 | NaN |
A4 | B4 | C4 | D4 |
NaN | NaN | C5 | D5 |
딱 봐도 C3는 있으나 D항목은 없고, A5나 B5항목도 겹치는 게 없음을 알 수 있다.
그렇기에 해당 항목은 NaN 처리한다.
Left Join
첫번째 DataFrame을 기준으로 두 번째 DataFrame을 병합.
A | B | C |
A2 | B2 | C2 |
A3 | B3 | C3 |
A4 | B4 | C4 |
+
C | D |
C1 | D1 |
C2 | D2 |
C4 | D4 |
C5 | D5 |
결과
A | B | C | D |
A2 | B2 | C2 | D1 |
A3 | B3 | C3 | NaN |
A4 | B4 | C4 | D4 |
왼쪽 데이터 프레임의 값들은 전부 들어가 있고, D 열만 생겼다.
Right Join
Right Join도 Left Join과 마찬가지이다.
2. Merge와 Join 구현 코드
Pandas의 merge 함수 or DataFrame의 Join 메소드
병합할 데이터.merge(병합할 데이터 함수, on=어떤 함수를 기준으로, how=어떤 방식으로)
join도 같은 방식
유사해보이지만 차이점이 있다.
join은 인덱스를 기준으로 병합을 진행하며,
merge는 컬럼을 기준으로 병합을 진행한다.
Pandas의 Index
Pandas에서 join을 사용하여 인덱스를 기준으로 병합하면,
중복된 컬럼이 있을 때 두 개의 컬럼 모두 DataFrame에 다른 이름으로 저장된다.
3. 데이터 연결
연결은 공유하는 Key 값을 사용하지 않는다.
데이터를 기존 DataFrame의 아래 또는 우측에 붙여서 연결한다.
axis =0 이면 행 방향으로 아래쪽으로 늘어난다.
axis =1이면 열 방향으로 옆쪽으로 늘어나고, 일대일 방식이 아니라면, 결측치(NaN)이 자동으로 생긴다.
데이터 병합 / 연결 활용 예시
1. 서로 다른 성격을 가진 데이터를 분석을 위해 하나의 데이터 셋으로 취합(제품, 고객)
2. 여러 그룹으로 산재된 데이터를 하나로 취합 (1월, 2월, 3월, ..같은 걸 1년치 데이터로 바꿀 떄)