pandas의 DataFrame에 대한 Inner Join, Outer Join, Left Join, Right Join

판다스에서 데이터프레임은 테이블 형식의 데이터셋입니다. DBMS의 Table들 간에도 Join을 맺을 수 있듯이, 마찬가지로 판다스의 데이터프레임들 간에도 Join을 맺을 수 있습니다. 물론 Join을 맺을 공통 필드가 존재한다면 말입니다.

Join에는 모두 4가지 방식이 존재합니다. 즉, 두 데이터셋 간의 중복된 요소만을 Join하는 Inner Join과 두 데이터셋에 대한 모든 데이터를 Join하는 Outter Join, 그리고 왼쪽 데이터셋을 기준으로 하는 Left Join과 오른쪽 데이터셋을 기준으로 하는 Right Join입니다. 보다 명확한 Join의 파악은 아래의 코드 예제를 통해 파악할 수 있습니다.

먼저 Join 하고자 하는 데이터셋으로, 판다스의 데이터프레임을 아래 코드처럼 정의합니다.

결과는 아래와 같습니다.

두 데이터프레임 간에는 key라는 공통 필드가 존재하는 것을 볼 수 있습니다. 이를 토대로 먼저 Inner Join에 대한 코드입니다.

위의 코드의 결과는 다음과 같습니다.

다음은 Outer Join에 대한 코드입니다.

결과는 다음과 같습니다.

다음은 Left Join에 대한 코드입니다.

결과는 다음과 같습니다.

다음은 Right Join에 대한 코드입니다.

다음은 실행 결과입니다.

모든 Join은 pd.merge 함수를 통해 이루어지는데요. 위의 예제 코드를 보면 두 데이터프레임의 Join 필드가 모두 ‘key’라는 것을 알 수 있습니다. 이처럼 Join 필드의 이름이 동일할 경우 pd.merge의 left_on과 right_on 인자 대신 on 인자 하나로 대체가 가능합니다. 예를들어, Inner Join의 경우는 아래와 같습니다.

pd.merge 함수의 인자중 how도 생략되었는데, 이는 Inner Join이 pd.merge의 인자 how의 기본값이기 때문입니다.

NumPy 노트

“나는 천성적으로 암기력이 좋지 못해 기록하지 못한 것은 기억하지 못한다.”라는 생각을 (사실이지만) 기반으로 NumPy에 대한 내용을 단편적으로 정리합니다. NumPy는 직관적이지만 때론, 자주 그 함축적인 코드 안에 내포된 의미를 파악하지 못해 해매이는 경우가 허다했습니다. 물론 그 함축적인 의미는 기본과 기본들의 연결로 완성된 것이기에 기본적인 내용을 더 중요시하여 기록해 둡니다.

#1. 배열로 생성

#2. 원소의 접근

#3. 산술 연산

numpy.ndarray 타입 객체 간의 산술연산(+, -, *, /)는 원소별(element-wise product)입니다. +, -, *, / 산술연산에 대한 동일한 매서드는 각각 np.add, np.subtract, np.multiply, np.divide 입니다.

numpy.ndarray과 단일값(Scalar)에 대한 산술 연산은 보로드케스트(Boradcast) 처리됩니다.

#4. 브로드케스트

스칼라뿐만 아니라 shape가 다른 배열 간에도 브로드케스트로 처리됩니다.

#5. 행렬의 곱(내적) 연산

#6. 배열 요소의 합과 곱

True는 1로, False 0으로 변환되어 합산됩니다.

#7. 배열 요소 중 최대값의 인덱스 구하기

np.argmax(x)는 x 배열을 1차원으로 평면화된 배열에 대해 최대값을 갖는 인덱스를 반환하고, np.argmax(x, axis=0)는 첫번째 축인 row 방향(세로방향)으로 구성되는 요소 중 최대인 인덱스를 반환하며, y1 = np.argmax(x, axis=1)는 두번째 축인 column 방향(가로방향)으로 구성되는 요소 중 최대인 인덱스를 반환합니다.

#8. 배열 요소 중 임의로 몇 개만 뽑아내기

기계학습이나 신경망 훈련 때 방대한 입력 데이터 중 일부만을 뽑아내 활용해야 하는 경우가 있는데, 이를 위한 코드입니다. 아래는 총 9개의 요소 중 3개의 요소를 임의로 뽑아내 배열로 반환합니다.

#9. 배열 요소의 형변환

아래처럼 배열을 생성할 때 타입을 강제로 지정할 수도 있습니다.

#10. Masking 연산

요소 타입이 boolean인 조건 배열을 이용해서 원하는 위치의 요소값만 변경하는 마스킹 연산입니다.

c와 b는 각각 아래와 같습니다.

#11. 배열 요소의 최대, 최소, 합, 평균 구하기

축(axis)에 대한 연산의 예는 다음과 같습니다.

Numpy의 axis에 대한 이해를 돕는 글은 아래를 참고하기 바랍니다.

Numpy의 axis에 따른 연산

#12. 주어진 범위에서 일정한 간격으로 배열 만들기

예를들어, 0부터 10까지 순차적으로 3개의 요소로 구성된 배열을 생성하고자 한다면..

#13. 중복되는 요소 제거하기

배열 요소 중 유일한 값만으로 구성하기 위한 내용입니다.

#14. 인덱스 리스트를 통한 특정 원소 값 얻기(Fany Indexing)

배열에 대한 다수의 인덱스를 리스트로 지정하고, 해당 인덱스의 값을 얻는 내용입니다.

#15. 2차원 배열을 1차원 배열로 만들기

#16. 전치행렬 및 행렬식 구하기

전치행렬은 행과 열의 위치가 서로 바뀐 행렬이며, 행렬식은 정방행렬에 대해서만 구할 수 있으며 선형 변환의 특징을 나타내는 스칼라값입니다.

#17. 대각행렬을 뽑아내거나, 대각 행렬 만들기

행렬의 대각 성분만을 뽑아내는 코드는 다음과 같습니다.

offset의 기본값은 0이며, 이 값을 조정하여 뽑아낼 대각성분의 위치를 조정할 수 있습니다. np.diag(a) 역시 동일한 기능인데, a가 1차원 배열일 때 a를 대각성분으로 하는 행렬을 만듭니다.

#18. 인덱스값을 담은 배열로 다른 배열의 요소값 뽑아내기

#19. 배열의 요소값 이산화

위의 예는 [최소,3), [3,6), [6,최대] 구간에 포함되는 요소를 각각 0, 1, 2로 이산화시킵니다. np.digitize 함수의 인자 중 right=True로 지정하면 이산화를 위한 구간을 [최소,3], (3,6], (6,최대]으로 변경됩니다.

#20. 배열 요소 전체에 대한 지정 표현(…)

#21. NaN 값 삭제하기

#22. 특정한 값 대체하기

예를들어, 배열 요소 중에 값이 2인 항목을 100으로 변경하고자 한다면 다음 코드의 예와 같습니다.

#23. 두 배열을 합치기

여기서 소개할 배열을 합치는 넘파이의 함수에는 3가지로, vstack, hstack, concatenate가 있습니다. vstack은 Vertical Stack으로 수직방향으로 쌓아 합치는 것이고, hstack은 Horizontal Stack으로 수평방향으로 쌓아 합치는 것입니다. 그리고 concatenate은 합치고자 하는 배열에 맞게 합치는 것입니다. 구체적인 내용은 아래의 예제 코드를 통해 명확하게 확인할 수 있습니다.

concatenate에 대해 좀더 구체적으로 파악하기 위해 다음 예를 들어봅니다.

#24. 배열 요소 뒤집기

배열을 구성하고 있는 요소들의 구성 순서를 뒤집고자 하는 경우에 대한 예입니다. 먼저 간단이 1차원 배열에 대한 경우입니다.

이제 2차원 배열에 대해 살펴보면, 먼저 Row 벡터를 단위로 뒤집는 코드입니다.

다음은 Row 벡터를 구성하는 요소들을 뒤집는 코드입니다.

다음은 Row 벡터를 단위로 뒤집음과 동시에 Row 벡터를 구성하는 요소도 뒤집는 코드입니다.

#25. numpy.flip 함수를 이용한 배열 요소 뒤집기

flip 함수를 통해 좀더 쉽고 직관적으로 배열 요소를 뒤집을 수 있습니다. 3차원 이상의 배열에 대해서 뒤집을때 좀더 직관적입니다. 코드는 아래와 같습니다.

#25. 어떤 배열로부터 원하는 데이터를 뽑아내 새로운 배열 구성하기

B는 A에 대해서 열(Column) 인덱스 0, 2에 대한 데이터만을 뽑아낸 배열이고, C는 A에 대해서 행(Row) 인덱스 0, 2에 대한 데이터만을 뽑아낸 배열입니다.