Pandas의 효율적인 데카르트 곱(CROSS JOIN)
소개:
데카르트 곱, CROSS JOIN이라고도 하는 데이터의 기본 작업입니다. 분석. 팬더에서는 한 DataFrame의 모든 행을 다른 DataFrame의 모든 행과 결합하는 작업이 포함됩니다. 이해하기 쉽지만 데카르트 곱을 직접 계산하는 것은 특히 대규모 데이터 세트의 경우 계산 비용이 많이 들 수 있습니다.
모범 사례:
1. '키' 열 방법:
이 접근 방식은 중소 규모 데이터세트에 적합합니다.
def cartesian_product_key(left, right): return left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1)
2. 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)
3. 고유 및 비고유 인덱스에 대한 일반화된 CROSS JOIN:
이 방법은 모든 유형의 인덱스를 사용하여 DataFrame을 처리할 수 있습니다:
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]]]))
4. 다중 DataFrame CROSS JOIN:
이는 여러 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)]))
5. 두 DataFrame에 대한 단순화된 CROSS JOIN:
@senderle의 cartesian_product만큼 빠른 이 방법은 특히 두 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 기반 솔루션이 대규모 데이터 세트에 대해 지속적으로 다른 솔루션보다 뛰어난 성능을 발휘한다는 것을 보여줍니다.
결론:
데카르트 곱을 계산하기 위한 올바른 방법 선택 pandas는 데이터세트의 크기와 특성에 따라 달라집니다. 성능이 최우선이라면 NumPy 기반 솔루션 중 하나를 선택하세요. 편의성과 유연성을 위해 '키' 열 방식이나 일반화된 CROSS JOIN을 고려하세요.
위 내용은 Pandas에서 어떻게 Cartesian Product(CROSS JOIN)를 효율적으로 수행할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!