Maison > développement back-end > Tutoriel Python > Comment puis-je exécuter efficacement un produit cartésien (CROSS JOIN) dans Pandas ?

Comment puis-je exécuter efficacement un produit cartésien (CROSS JOIN) dans Pandas ?

Susan Sarandon
Libérer: 2024-12-09 04:07:13
original
789 Les gens l'ont consulté

How Can I Efficiently Perform a Cartesian Product (CROSS JOIN) in Pandas?

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)
Copier après la connexion

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)  
Copier après la connexion

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]]]))
Copier après la connexion

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)]))
Copier après la connexion

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()]]))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal