Maison  >  Article  >  développement back-end  >  Comment effectuer efficacement des jointures basées sur une plage dans Pandas ?

Comment effectuer efficacement des jointures basées sur une plage dans Pandas ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-02 00:19:02646parcourir

How to Efficiently Perform Range-Based Joins in Pandas?

Optimisation des jointures basées sur une plage dans Pandas

Lorsque vous travaillez avec des dataframes, il est souvent nécessaire d'effectuer des jointures basées sur une condition de plage. Une approche courante dans Pandas consiste à créer une colonne factice, à y joindre et à filtrer les lignes inutiles. Cependant, cette solution peut être coûteuse en termes de calcul, en particulier pour les grands ensembles de données.

Heureusement, il existe des moyens plus efficaces et plus élégants pour réaliser des jointures basées sur une plage dans Pandas.

Utiliser numpy Broadcasting

La méthode la plus simple consiste à tirer parti de la diffusion numpy. Cela implique de convertir les trames de données Pandas en tableaux numpy et d'utiliser des opérations booléennes pour identifier les lignes correspondantes.

<code class="python">import numpy as np

a = A.A_value.values
bh = B.B_high.values
bl = B.B_low.values

i, j = np.where((a[:, None] >= bl) & (a[:, None] <= bh))

pd.concat([
    A.loc[i, :].reset_index(drop=True),
    B.loc[j, :].reset_index(drop=True)
], axis=1)</code>

Cette approche est extrêmement efficace car elle évite des itérations de lignes coûteuses.

Extension vers la gauche. Jointures

Pour étendre cette solution aux jointures gauches, nous pouvons ajouter les lignes restantes de la trame de données A qui ne correspondent à aucune ligne de la trame de données B.

<code class="python">pd.concat([
    A.loc[i, :].reset_index(drop=True),
    B.loc[j, :].reset_index(drop=True)
], axis=1).append(
    A[~np.in1d(np.arange(len(A)), np.unique(i))],
    ignore_index=True, sort=False
)</code>

Cela garantit que toutes les lignes du dataframe A sont incluses dans le résultat, même si elles n'ont pas de ligne correspondante dans le dataframe B.

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