Wie kann man Pandas-DataFrames mit einem bedingten Join für den Datumsbereich effizient zusammenführen?

Mary-Kate Olsen
Freigeben: 2024-10-31 07:33:30
Original
120 Leute haben es durchsucht

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

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'])]
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!