Maison  >  Article  >  développement back-end  >  Comment fusionner efficacement des DataFrames Pandas avec une jointure conditionnée sur une plage de dates ?

Comment fusionner efficacement des DataFrames Pandas avec une jointure conditionnée sur une plage de dates ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-31 07:33:30177parcourir

How to Efficiently Merge Pandas DataFrames with a Conditioned Join on Date Range?

Fusionner les trames de données Pandas avec jointure conditionnelle sur la plage de dates

Vous devez fusionner deux trames de données, A et B, en fonction d'un identifiant (" cusip") et une condition dans laquelle la date dans la trame de données A ("fdate") se situe entre deux dates dans la trame de données B ("namedt" et "nameenddt").

Malgré la reconnaissance de la facilité SQL de cette tâche, vous Nous sommes coincés avec une approche pandas impliquant une fusion inconditionnelle suivie d'un filtrage, ce qui peut s'avérer inefficace. Voici pourquoi cette approche n'est pas optimale :

df = pd.merge(A, B, how='inner', left_on='cusip', right_on='ncusip')
df = df[(df['fdate']>=df['namedt']) & (df['fdate']<=df['nameenddt'])]

Au lieu de potentiellement créer une grande trame de données intermédiaire avant le filtrage, vous recherchez une solution qui intègre le filtrage dans l'opération de fusion elle-même.

Exploration une approche alternative

Pour des scénarios comme celui-ci, envisagez d'utiliser une base de données comme SQLite. La méthode to_sql de Pandas peut facilement écrire des trames de données dans une base de données. Par la suite, les requêtes SQL permettent des opérations de filtrage et de fusion efficaces.

Voici un exemple utilisant des dataframes imaginaires et une connexion à une base de données :

import pandas as pd
import sqlite3

# Sample dataframes
presidents = pd.DataFrame({"name": ["Bush", "Obama", "Trump"], "president_id": [43, 44, 45]})
terms = pd.DataFrame({"start_date": pd.date_range('2001-01-20', periods=5, freq='48M'), "end_date": pd.date_range('2005-01-21', periods=5, freq='48M'), "president_id": [43, 43, 44, 44, 45]})
war_declarations = pd.DataFrame({"date": [datetime(2001, 9, 14), datetime(2003, 3, 3)], "name": ["War in Afghanistan", "Iraq War"]})

# Database connection
conn = sqlite3.connect(':memory:')

# Write dataframes to database
terms.to_sql('terms', conn, index=False)
presidents.to_sql('presidents', conn, index=False)
war_declarations.to_sql('wars', conn, index=False)

# SQL query
qry = '''
    SELECT
        start_date AS PresTermStart,
        end_date AS PresTermEnd,
        wars.date AS WarStart,
        presidents.name AS Pres
    FROM
        terms
    JOIN
        wars ON date BETWEEN start_date AND end_date
    JOIN
        presidents ON terms.president_id = presidents.president_id
'''

# Read query results into pandas dataframe
df = pd.read_sql_query(qry, conn)

Cette approche vous permet de rejoindre et de filtrer sans créer un fichier inutilement volumineux. trame de données intermédiaire.

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