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 중국어 웹사이트의 기타 관련 기사를 참조하세요!