Produit cartésien efficace (CROSS JOIN) chez les pandas
Introduction :
Produit cartésien, également connue sous le nom de CROSS JOIN, est une opération fondamentale dans l'analyse des données. Chez les pandas, cela implique de combiner chaque ligne d'un DataFrame avec chaque ligne d'un autre. Bien que simple à comprendre, le calcul direct du produit cartésien peut s'avérer coûteux en termes de calcul, en particulier pour les grands ensembles de données.
Bonnes pratiques :
1. La méthode des colonnes « clés » :
Cette approche fonctionne bien pour les ensembles de données de petite à moyenne taille :
def cartesian_product_key(left, right): return left.assign(key=1).merge(right.assign(key=1), on='key').drop('key', 1)
2. Solutions basées sur NumPy :
Pour les ensembles de données plus volumineux, les solutions basées sur NumPy offrent de meilleures performances :
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 généralisé pour les index uniques et non uniques :
Cette méthode peut gérer des DataFrames avec tout type d'index :
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. Multi-DataFrame CROSS JOIN :
Cela étend l'approche précédente pour gérer plusieurs DataFrames :
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. CROSS JOIN simplifié pour deux DataFrames :
Cette méthode, presque aussi rapide que le cartesian_product de @senderle, est particulièrement efficace pour deux DataFrames :
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 sur différentes tailles d'ensembles de données révèle que le Les solutions basées sur NumPy surpassent systématiquement les autres pour les grands ensembles de données.
Conclusion :
Le choix de la bonne méthode pour calculer le produit cartésien chez les pandas dépend de la taille et des caractéristiques de vos ensembles de données. Si les performances sont une priorité, optez pour l'une des solutions basées sur NumPy. Pour plus de commodité et de flexibilité, envisagez la méthode de colonne « clé » ou le CROSS JOIN généralisé.
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!