CROSS JOIN
CROSS JOIN은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 것을 뜻하며, 두 테이블의 각 행의 개수를 곱한 만큼의 결과가 나온다.
Pandas DataFrame을 join 하는 법은 2022.12.25 - [Python] Pandas - 데이터프레임 합성 1 (merge / join)에서 살펴보았는데, cross join에 대해서는 정리하지 않아서 추가로 정리한다.
pandas 1.2 이상의 버전인 경우
위의 예시 그림처럼 hair type과 hair style 두 개의 DataFrame이 있다고 하자.
import pandas as pd
import numpy as np
hair_type = pd.DataFrame({'Hair Type' : ['A', 'B', 'C']})
hair_style = pd.DataFrame({'Hair Style' : ['Straight', 'Curly']})
# DF 출력
Hair Type
0 A
1 B
2 C
Hair Style
0 Straight
1 Curly
pandas 1.2 이상의 버전인 경우 merge나 join의 how 매개변수를 cross 값으로 지정하여 cross join을 수행할 수 있다.
pd.merge(hair_type, hair_style, how='cross')
hair_type.join(hair_style, how='cross')
pandas 1.2 미만의 버전인 경우
pandas 1.2 이상의 버전에서는 merge나 join 함수가 cross join을 지원하지 않는다. 이때 가장 간단하게 CROSS JOIN을 수행하는 방법은 각 DataFrame에 join에 사용할 공통 컬럼을 생성해 처리하는 것이다.
import pandas as pd
import numpy as np
hair_type = pd.DataFrame({'Hair Type' : ['A', 'B', 'C']})
hair_style = pd.DataFrame({'Hair Style' : ['Straight', 'Curly']})
hair_type['key'] = 0
hair_style['key'] = 0
pd.merge(hair_type, hair_style, on='key').drop(columns='key')
임시 컬럼 생성과 join 수행 부분을 한 번에 표현하면 아래와 같다.
def cartesian_product_basic(left, right):
return (
left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1))
cartesian_product_basic(hair_type, hair_style)
참고 문서
https://www.tutorialrepublic.com/sql-tutorial/sql-cross-join-operation.php
https://www.tutorialspoint.com/sql/sql-cross-join.htm
https://pandas.pydata.org/docs/reference/api/pandas.merge.html