Python/NumPy | Pandas

[Pandas] DataFrame CROSS JOIN

비번변경 2023. 8. 11. 19:40

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

Performant cartesian product (CROSS JOIN) with pandas