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
Libérer: 2024-12-06 02:21:11
original
335 Les gens l'ont consulté

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

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

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

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

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!

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