> 백엔드 개발 > 파이썬 튜토리얼 > Pandas DataFrames의 데카르트 곱(교차 조인)을 효율적으로 수행하려면 어떻게 해야 합니까?

Pandas DataFrames의 데카르트 곱(교차 조인)을 효율적으로 수행하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-13 02:56:09
원래의
777명이 탐색했습니다.

How Can I Efficiently Perform a Cartesian Product (Cross Join) of Pandas DataFrames?

Pandas를 사용한 고성능 데카르트 곱(CROSS JOIN)

Pandas에서 두 DataFrame의 데카르트 곱(교차 조인)을 계산하는 것은 다음과 같습니다. 필수 작업. 다대다 JOIN 트릭은 작은 DataFrame에서는 합리적으로 작동하지만 데이터가 클수록 성능이 저하됩니다.

NumPy를 사용한 빠른 구현

더 빠른 구현은 1D에 ​​NumPy를 활용합니다. 데카르트 곱 계산:

def cartesian_product(*arrays):
    la = len(arrays)
    dtype = np.result_type(*arrays)
    arr = np.empty([len(a) for a in arrays] + [la], dtype=dtype)
    for i, a in enumerate(np.ix_(*arrays)):
        arr[...,i] = a
    return arr.reshape(-1, la)  
로그인 후 복사

일반화 다양한 DataFrame에 대한 솔루션

위의 트릭은 혼합되지 않은 스칼라 유형을 사용하는 DataFrame에 적용됩니다. 혼합된 dtype의 경우 사용에 따른 책임은 사용자에게 있습니다.

  • 고유한 인덱스 데이터 프레임으로 일반화:

    def cartesian_product_generalized(left, right):
        la, lb = len(left), len(right)
        idx = cartesian_product(np.ogrid[:la], np.ogrid[:lb])
        return pd.DataFrame(
            np.column_stack([left.values[idx[:,0]], right.values[idx[:,1]]]))
    로그인 후 복사
  • 처리 고유하지 않은 인덱스:
    위 솔루션은 다음으로 확장될 수 있습니다. 고유하지 않은 인덱스로 작업합니다.
  • 여러 DataFrame:
    여러 DataFrame은 다음을 사용하여 결합할 수 있습니다.

    def cartesian_product_multi(*dfs):
        idx = cartesian_product(*[np.ogrid[:len(df)] for df in dfs])
        return pd.DataFrame(
            np.column_stack([df.values[idx[:,i]] for i,df in enumerate(dfs)]))
    로그인 후 복사

두 사람을 위한 단순화된 솔루션 DataFrames

두 개의 DataFrame만 처리하는 경우 더 간단한 접근 방식을 사용할 수 있습니다.

def cartesian_product_simplified(left, right):
    la, lb = len(left), len(right)
    ia2, ib2 = np.broadcast_arrays(*np.ogrid[:la,:lb])

    return pd.DataFrame(
        np.column_stack([left.values[ia2.ravel()], right.values[ib2.ravel()]]))
로그인 후 복사

성능 비교

솔루션 벤치마킹 NumPy 기반 cartesian_product_generalized가 가장 빠른 것으로 나타났습니다. 두 개의 DataFrame에 대한 cartesian_product_simplified.

위 내용은 Pandas DataFrames의 데카르트 곱(교차 조인)을 효율적으로 수행하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿