簡體   English   中英

如何根據 python 中的多個標准連接兩個數據幀?

[英]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任務,但首先要確保EOMdate列實際上是相同的變量 dtype ( datetime )。

shortlist['date'] = pd.to_datetime(shortlist['date'], format='%Y-%m-%d')
MCap['EOM'] = pd.to_datetime(MCap['EOM'], format='%d/%m/%Y')

然后進行合並(如果tickerCodes是索引,這將不起作用,如果是,則首先重置索引,即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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM