Jointure croisée performante (CROSS JOIN) avec Pandas
Dans cet article, nous explorons les méthodes les plus efficaces pour réaliser un produit cartésien (CROSS JOIN) dans Pandas.
Méthode de base : clé temporaire Colonne
L'approche typique consiste à attribuer une colonne de clé temporaire aux deux DataFrames, à effectuer une jointure plusieurs-à-plusieurs sur cette clé, puis à supprimer la colonne de clé :
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)
Implémentation basée sur NumPy
Pour améliorer les performances sur des ensembles de données plus volumineux, nous exploitons l'implémentation de NumPy de le produit cartésien :
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)
Généralisation aux DataFrames indexés non uniques
Nous pouvons étendre cette approche pour gérer les DataFrames avec des indices non uniques :
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]]]))
Mise en œuvre simplifiée pour deux DataFrames
Lorsqu'il s'agit de seulement deux DataFrames, une technique plus simple utilisant np.broadcast_arrays peut obtenir des performances comparables :
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()]]))
Comparaison des performances
L'analyse comparative de ces méthodes révèle que les implémentations basées sur NumPy offrent les performances les plus rapides, en particulier pour les plus grandes ensembles de données :
[Image du tableau de comparaison des performances]
Lectures complémentaires
Pour une analyse plus approfondie des opérations de fusion Pandas, explorez les sujets suivants :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!