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!