亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何有條件地查找數據框中給定日期之后的較早日期?

如何有條件地查找數據框中給定日期之后的較早日期?

揚帆大魚 2023-07-27 13:58:35
我正在嘗試在兩個數據幀之間查找一系列 ID。Lookup_df 中的每個 ID 都有一個發布日期,我需要查找 ref_df 中相對于 Lookup_df 日期的最后日期。在下面的示例中,lookup_df ID 123 于 20200218 發布,因此在 ref_df 中的日期中,我只需要查看 ID 為 123 的日期,并找到在此之前的最后一個日期,即 20200201。我已經嘗試了各種循環,但無法完成這項工作,并且真實的數據庫超過 600k 行,所以我擔心我當前的方法(創建臨時 DF 然后循環)會導致完成此操作所需的運行時間不切實際。ref_df = pd.DataFrame({'ID':[123,123,123,345,345,345],'version':['version1','version2','version3','version4','version5','version6'],                       'date effective from':['20200101','20200201','20200301','20200401','20200501','20200601',]})print(ref_df)lookup_df = pd.DataFrame({'ID':[123,345],'date':['20200218','20200522']})print(lookup_df)for index, row in lookup_df.iterrows():    temp_df = ref_df[ref_df['ID']==row['ID']]    for index2, row2 in temp_df:        #some code here to find the right date?!編輯 - 抱歉無法直接顯示表格,這是我不熟悉如何格式化我的問題的功能 - 感謝指點!
查看完整描述

3 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

這是一個使用的選項last_valid_index():


idx = [ref_df.loc[ref_df['ID'] == value].last_valid_index() -

   1 for value in lookup_df['ID']]


print(ref_df.loc[idx])

編輯:刪除循環


mask = ref_df['ID'].isin(lookup_df['ID'])

new_df = ref_df[mask].groupby('ID').apply(lambda x: x.iloc[-2])

print(new_df)


查看完整回答
反對 回復 2023-07-27
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

更改date effective from為date并嘗試以下操作:


for index, row in lookup_df.iterrows():

    result = ref_df.loc[(ref_df['ID'] == row['ID']) & (ref_df['date'] < row['date'])].iloc[-1,:].values[-1]

    print(result)

輸出:


20200201

20200501


查看完整回答
反對 回復 2023-07-27
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

您可以首先使用lookup_df以下命令獲取“最新”日期:


latest = lookup_df[lambda x: x.ID == ID]['date'].iloc[0]

有了這個“最新”日期,我們可以進行另一個查詢ref_df以獲得所需的結果:


result = ref_df[lambda x: x.ID == ID]\

    [lambda x: x['date effective from'] < date]\

    ['date effective from']\

    .iloc[-1]

    

要對 中的所有 ID 執行相同的操作lookup_df,請將其包裝在代碼中,如下所示:


for _, row in lookup_df.iterrows():

    ID, date = row['ID', 'date']


    result = ref_df[lambda x: x.ID == ID]\

        [lambda x: x['date effective from'] < date]\

        ['date effective from']\

        .iloc[-1]

        

您不需要迭代 中的所有行ref_df,請使用如下所示的過濾器:


df[<some condition here>]

或者例如:


df[df['idx'] > 3]

返回其中列大于 3 的所有df行idx。


查看完整回答
反對 回復 2023-07-27
  • 3 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號