Pandas-Datenrahmen mit bedingtem Join im Datumsbereich zusammenführen
Sie müssen zwei Datenrahmen, A und B, basierend auf einer Kennung zusammenführen (" cusip“) und eine Bedingung, bei der das Datum in Datenrahmen A („fdate“) zwischen zwei Daten in Datenrahmen B („namedt“ und „nameenddt“) liegt.
Obwohl Sie die SQL-Einfachheit dieser Aufgabe erkannt haben, haben Sie Ich stecke bei einem Pandas-Ansatz fest, der eine bedingungslose Zusammenführung gefolgt von einer Filterung beinhaltet, die ineffizient sein kann. Aus diesem Grund ist dieser Ansatz nicht optimal:
df = pd.merge(A, B, how='inner', left_on='cusip', right_on='ncusip') df = df[(df['fdate']>=df['namedt']) & (df['fdate']<=df['nameenddt'])]
Anstatt möglicherweise vor dem Filtern einen großen Zwischendatenrahmen zu erstellen, suchen Sie nach einer Lösung, die das Filtern in den Zusammenführungsvorgang selbst einbezieht.
Erkunden ein alternativer Ansatz
Für Szenarien wie dieses sollten Sie die Verwendung einer Datenbank wie SQLite in Betracht ziehen. Mit der to_sql-Methode von Pandas können Datenrahmen bequem in eine Datenbank geschrieben werden. Anschließend ermöglichen SQL-Abfragen effiziente Filter- und Zusammenführungsvorgänge.
Hier ist ein Beispiel mit imaginären Datenrahmen und einer Datenbankverbindung:
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)
Mit diesem Ansatz können Sie verknüpfen und filtern, ohne unnötig große Datenrahmen zu erstellen Zwischendatenrahmen.
Das obige ist der detaillierte Inhalt vonWie kann man Pandas-DataFrames mit einem bedingten Join für den Datumsbereich effizient zusammenführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!