[英]How can I connect two dataframes based on mutliple criteria in python?
我有以下兩個數據框:
入圍名單:
ticker date open high low close volume
ABC 2000-12-29 0.450 0.455 0.445 0.455 205843.0
ABC 2001-01-31 0.410 0.410 0.405 0.410 381500.0
ABC 2001-02-28 0.380 0.405 0.380 0.400 318384.0
...
ABC 2001-06-30 0.430 0.445 0.430 0.440 104016.0
MCap
Code EOM mcRank MktCap
ABC 29/12/2000 74 1563.967892
ABC 31/03/2001 98 998.156279
ABC 30/06/2001 59 2035.603350
我現在想創建一個新表,將 MCap dataframe 中的 mcRank 和 MktCap 列添加到 Shortlist dataframe 中,其中代碼和日期匹配。 如果日期在 MCap 中的日期之間,則應使用最后一個已知日期。
結果應該是這樣的:
ticker date open high low close volume mcRank MktCap
ABC 2000-12-29 0.450 0.455 0.445 0.455 205843.0 74 1563.967892
ABC 2001-01-31 0.410 0.410 0.405 0.410 381500.0 74 1563.967892
ABC 2001-02-28 0.380 0.405 0.380 0.400 318384.0 74 1563.967892
...
ABC 2001-06-30 0.430 0.445 0.430 0.440 104016.0 59 2035.603350
我已經嘗試過 pd.concat 和 pd.merge - 但似乎無法獲得正確的結果。
你想做的是
首先對齊兩種日期格式,您可以將其處理為字符串,這樣更容易
第二個 pd.merge 它們,使用 left_on、right_on 和 how='outer' 合並所有內容,並故意創建 NA 值
然后你可以使用 DataFrame.fillna(method='ffill') 根據以前的值填充 na
好吧,這似乎是一個merge
任務,但首先要確保EOM
和date
列實際上是相同的變量 dtype ( datetime
)。
shortlist['date'] = pd.to_datetime(shortlist['date'], format='%Y-%m-%d')
MCap['EOM'] = pd.to_datetime(MCap['EOM'], format='%d/%m/%Y')
然后進行合並(如果ticker
或Codes
是索引,這將不起作用,如果是,則首先重置索引,即shortlist.rest_index(inplace=True)
):
new_df = shortlist.merge(how='left', left_on=['ticker', 'date'], right_on=['Code', 'EOM']).reset_index()
國際大學聯合會,
您可能必須分解這些步驟:首先在日期上合並兩個數據幀(我使用連接函數),然后使用 mcap 中最舊的日期填寫 null 值(我使用您的 output 的結果作為指南) :
轉換為日期時間並設置索引
df['date'] = pd.to_datetime(df['date'], format = '%Y-%m-%d')
df = df.set_index('date')
mcap['EOM'] = pd.to_datetime(mcap['EOM'])
mcap = mcap.set_index("EOM")
結合數據框:
res = df.join(mcap)
獲取 null 行的索引:
indices = res[res.isna().any(axis=1)].index
從 mcap 獲取最早日期的值:
latest_mcap = mcap.loc[mcap.index.min()].tolist()
將 latest_mcap 分配給 res 中的 null 值:
res.loc[indices,['Code','mcRank','MktCap']] = latest_mcap
ticker open high low close volume Code mcRank MktCap
date
2000-12-29 ABC 0.45 0.455 0.445 0.455 205843.0 ABC 74.0 1563.967892
2001-01-31 ABC 0.41 0.410 0.405 0.410 381500.0 ABC 74.0 1563.967892
2001-02-28 ABC 0.38 0.405 0.380 0.400 318384.0 ABC 74.0 1563.967892
2001-06-30 ABC 0.43 0.445 0.430 0.440 104016.0 ABC 59.0 2035.603350
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.