在日期範圍內使用條件連接合併Pandas 資料幀
您需要根據標識符合併兩個資料幀A 和B (" cusip」)以及資料幀A 中的日期(「fdate」)落在資料幀B 中的兩個日期(「namedt」和"nameenddt")。
儘管認識到此任務的 SQL 簡便性,但您仍受困於涉及無條件合併和過濾的 pandas 方法,這可能效率低下。這就是為什麼這種方法不是最理想的:
df = pd.merge(A, B, how='inner', left_on='cusip', right_on='ncusip') df = df[(df['fdate']>=df['namedt']) & (df['fdate']<=df['nameenddt'])]
您不需要在過濾之前創建一個大型臨時資料幀,而是尋求一種在合併操作本身中合併過濾的解決方案。
探索替代方法
對於這樣的場景,請考慮使用 SQLite 等資料庫。 Pandas 的 to_sql 方法可以方便地將資料幀寫入資料庫。隨後,SQL 查詢可以實現高效率的過濾和合併操作。
這是一個使用虛構資料幀和資料庫連接的範例:
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)
這種方法允許您連接和過濾,而無需創建不必要的大數據中間資料框。
以上是如何有效地將 Pandas DataFrame 與日期範圍內的條件連結合併?的詳細內容。更多資訊請關注PHP中文網其他相關文章!