Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencantumkan Bingkai Data Panda dengan Cekap dengan Gabungan Bersyarat pada Julat Tarikh?

Bagaimana untuk Mencantumkan Bingkai Data Panda dengan Cekap dengan Gabungan Bersyarat pada Julat Tarikh?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 07:33:30176semak imbas

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

Gabungkan Bingkai Data Panda dengan Sertaan Bersyarat pada Julat Tarikh

Anda perlu menggabungkan dua bingkai data, A dan B, berdasarkan pengecam (" cusip") dan keadaan di mana tarikh dalam bingkai data A ("fdate") berada di antara dua tarikh dalam bingkai data B ("namedt" dan "nameenddt").

Walaupun mengenali kemudahan SQL tugas ini, anda terperangkap dengan pendekatan panda yang melibatkan penggabungan tanpa syarat diikuti dengan penapisan, yang boleh menjadi tidak cekap. Inilah sebabnya pendekatan ini tidak optimum:

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

Daripada berpotensi mencipta kerangka data interim yang besar sebelum menapis, anda mencari penyelesaian yang menggabungkan penapisan dalam operasi gabungan itu sendiri.

Menerokai Pendekatan Alternatif

Untuk senario seperti ini, pertimbangkan untuk menggunakan pangkalan data seperti SQLite. Kaedah to_sql Pandas boleh menulis kerangka data ke pangkalan data dengan mudah. Selepas itu, pertanyaan SQL mendayakan operasi penapisan dan penggabungan yang cekap.

Berikut ialah contoh menggunakan kerangka data khayalan dan sambungan pangkalan data:

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)

Pendekatan ini membolehkan anda untuk menyertai dan menapis tanpa membuat saiz yang tidak perlu besar. bingkai data perantaraan.

Atas ialah kandungan terperinci Bagaimana untuk Mencantumkan Bingkai Data Panda dengan Cekap dengan Gabungan Bersyarat pada Julat Tarikh?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn