Pandas에서 두 개의 DataFrame을 병합할 때는 merge() 함수를 사용합니다. 특히 두 DataFrame 간의 데카르트 곱(Cartesian Product), 즉 모든 행 조합을 생성하는 교차 결합(Cross Join)을 수행하려면 merge() 함수의 how 매개변수에 "cross" 값을 설정하면 됩니다.
how = "cross"
1. Pandas 라이브러리 임포트
먼저 pandas 라이브러리를 관례적인 별칭 pd로 임포트합니다.
import pandas as pd
2. 첫 번째 DataFrame 생성
차량 이름과 판매 대수 정보를 담은 첫 번째 DataFrame을 만듭니다.
dataFrame1 = pd.DataFrame(
{
"Car": ['BMW', 'Mustang', 'Bentley', 'Jaguar'],
"Units": [100, 150, 110, 120]
}
)3. 두 번째 DataFrame 생성
차량 이름과 등록 가격 정보를 담은 두 번째 DataFrame을 만듭니다.
dataFrame2 = pd.DataFrame(
{
"Car": ['BMW', 'Tesla', 'Jaguar'],
"Reg_Price": [7000, 8000, 9000]
}
)4. how="cross"로 병합하여 데카르트 곱 생성
이제 merge() 함수의 how 매개변수에 "cross"를 지정하여 두 DataFrame을 병합합니다. 결과적으로 첫 번째 DataFrame의 각 행이 두 번째 DataFrame의 모든 행과 짝지어진 데카르트 곱이 만들어집니다.
mergedRes = pd.merge(dataFrame1, dataFrame2, how="cross")
전체 예제 코드
import pandas as pd
# 첫 번째 DataFrame 생성
dataFrame1 = pd.DataFrame(
{
"Car": ['BMW', 'Mustang', 'Bentley', 'Jaguar'],
"Units": [100, 150, 110, 120]
}
)
print("DataFrame1 ...\n", dataFrame1)
# 두 번째 DataFrame 생성
dataFrame2 = pd.DataFrame(
{
"Car": ['BMW', 'Tesla', 'Jaguar'],
"Reg_Price": [7000, 8000, 9000]
}
)
print("\nDataFrame2 ...\n", dataFrame2)
# how="cross"로 병합하여 데카르트 곱 생성
mergedRes = pd.merge(dataFrame1, dataFrame2, how="cross")
print("\n데카르트 곱이 적용된 병합 DataFrame...\n", mergedRes)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다. 4행 × 3행 = 총 12개의 행 조합이 생성된 것을 확인할 수 있습니다.
DataFrame1 ...
Car Units
0 BMW 100
1 Mustang 150
2 Bentley 110
3 Jaguar 120
DataFrame2 ...
Car Reg_Price
0 BMW 7000
1 Tesla 8000
2 Jaguar 9000
데카르트 곱이 적용된 병합 DataFrame...
Units Car_y Reg_Price
0 100 BMW 7000
1 100 Tesla 8000
2 100 Jaguar 9000
3 150 BMW 7000
4 150 Tesla 8000
5 150 Jaguar 9000
6 110 BMW 7000
7 110 Tesla 8000
8 110 Jaguar 9000
9 120 BMW 7000
10 120 Tesla 8000
11 120 Jaguar 9000참고 사항
두 DataFrame에 동일한 이름의 열("Car")이 존재하기 때문에, 교차 결합 시 열 이름이 자동으로 구분되어 접미사(_x, _y)가 붙거나 하나의 열로 처리됩니다. 키 열 없이 단순히 모든 조합을 얻고 싶다면 how="cross"가 가장 직관적이며, 이 방식은 Pandas 1.2.0 버전부터 지원됩니다. 대용량 데이터에서는 데카르트 곱의 결과 행 수가 두 DataFrame 행 수의 곱만큼 급격히 증가하므로 메모리 사용량에 유의해야 합니다.