Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Pandas – merge() 함수로 두 DataFrame의 데카르트 곱(Cross Join) 병합하기

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 행 수의 곱만큼 급격히 증가하므로 메모리 사용량에 유의해야 합니다.