Maison >développement back-end >Tutoriel Python >Comment effectuer efficacement une CROSS JOIN dans Pandas ?

Comment effectuer efficacement une CROSS JOIN dans Pandas ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-06 02:21:11331parcourir

How to Efficiently Perform a CROSS JOIN in Pandas?

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 :

  • [Fusion bases](https://pbpython.com/pandas-merging-101-cheat-sheet.html)
  • [Jointures basées sur un index](https://pbpython.com/pandas-merging-101- join-indexes.html)
  • [Généralisation à plusieurs DataFrames](https://pbpython.com/pandas-merging-on-multiple-dataframes.html)

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!

Déclaration:
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