Maison > Article > développement back-end > Comment fusionner efficacement des DataFrames Pandas avec une jointure conditionnée sur une plage de dates ?
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!