Pandas를 사용한 교차 조인(CROSS JOIN)
이 게시물에서는 데카르트 곱(CROSS)을 수행하는 가장 효율적인 방법을 탐색합니다. JOIN) Pandas에서의 작업.
기준선 방법: 임시 키 열
일반적인 접근 방식은 두 DataFrame에 임시 키 열을 할당하고 해당 키에 대해 다대다 조인을 수행한 다음 키 열을 삭제하는 것입니다.
left = pd.DataFrame({'col1' : ['A', 'B', 'C'], 'col2' : [1, 2, 3]}) right = pd.DataFrame({'col1' : ['X', 'Y', 'Z'], 'col2' : [20, 30, 50]}) def cartesian_product_basic(left, right): return ( left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1)) cartesian_product_basic(left, right)
NumPy 기반 구현
더 큰 규모의 성능 향상 데이터세트에서 NumPy의 데카르트 곱 구현을 활용합니다.
import numpy as np 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)
고유하지 않은 인덱스 데이터프레임에 대한 일반화
이 접근 방식을 확장하여 비-고유 인덱스 데이터프레임을 처리할 수 있습니다. 고유한 인덱스:
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만 처리할 때 np.broadcast_arrays를 활용하는 더 간단한 기술로 비슷한 성능을 얻을 수 있습니다.
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 기반 구현이 특히 대규모 데이터 세트의 경우 가장 빠른 성능을 제공한다는 것을 알 수 있습니다.
[성능 비교 차트 이미지]
추가 자료
Pandas에 대해 더 자세히 알아보려면 병합 작업에서는 다음 주제를 살펴보세요.
위 내용은 Pandas에서 CROSS JOIN을 효율적으로 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!