Maison >développement back-end >Tutoriel Python >Comment fusionner efficacement les DataFrames Pandas avec des conditions de plage de dates ?

Comment fusionner efficacement les DataFrames Pandas avec des conditions de plage de dates ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 13:49:021049parcourir

How to Efficiently Merge Pandas DataFrames with Date Range Conditions?

Fusion de trames de données Pandas avec des conditions de plage de dates

Pour fusionner deux trames de données Pandas où une valeur se situe entre deux autres, une approche courante consiste à fusionner les trames de données sans condition sur un identifiant et filtrage ultérieur en fonction de la condition de date. Cependant, cette méthode peut entraîner des inefficacités de mémoire.

Une solution alternative qui exploite la puissance de SQL consiste à effectuer la fusion et le filtrage au sein d'une requête SQL, comme illustré ci-dessous :

<code class="python">import pandas as pd
import sqlite3

# Create 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"]})

# Create an in-memory database
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)

# Execute SQL query to merge and filter dataframes
qry = '''
    select  
        start_date PresTermStart,
        end_date PresTermEnd,
        wars.date WarStart,
        presidents.name Pres
    from
        terms join wars on
        date between start_date and end_date join presidents on
        terms.president_id = presidents.president_id
    '''
df = pd.read_sql_query(qry, conn)

print(df)</code>

Résultat :

         PresTermStart          PresTermEnd             WarStart  Pres
0  2001-01-31 00:00:00  2005-01-31 00:00:00  2001-09-14 00:00:00  Bush
1  2001-01-31 00:00:00  2005-01-31 00:00:00  2003-03-03 00:00:00  Bush

En effectuant la fusion et le filtrage dans SQL, nous pouvons éviter de créer une trame de données intermédiaire potentiellement volumineuse, ce qui améliore l'efficacité de la mémoire.

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