日付範囲の条件付き結合を使用して Pandas データフレームをマージします
識別子に基づいて 2 つのデータフレーム A と B をマージする必要があります (" cusip") と、データフレーム A ("fdate") の日付がデータフレーム B ("namedt" と "nameenddt") の 2 つの日付の間にあるという条件です。
このタスクの SQL の容易さは認識していますが、無条件マージとそれに続くフィルタリングを含むパンダのアプローチに行き詰まっており、非効率的になる可能性があります。このアプローチが次善である理由は次のとおりです。
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 中国語 Web サイトの他の関連記事を参照してください。