簡體   English   中英

按日期更新另一個 DataFrame 中的值

[英]Update values in a DataFrame by values in another by date

我試圖制作一個代碼來輸入項目的版本。 有兩個數據框,一個包含項目,一個包含版本信息。

這是我制作的虛擬數據和代碼:

import pandas as pd
from datetime import datetime

Item = pd.DataFrame({"ID":["A1","A1","A2","A2","A3","B1"],"DATE":["2021-07-05","2021-08-01","2021-02-02","2021-02-03","2021-01-01","2021-10-12"]})
Ver = pd.DataFrame({"ver_date" : ["2021-01-01","2021-07-07","2021-09-09"],"version":["1.1","1.2","1.3"]})

for id,dat in zip(Item["ID"],Item["DATE"]):
    dat2 = datetime.strptime(dat,'%Y-%m-%d')
    for dtc,ver in zip(Ver["ver_date"],Ver["version"]):
        dtc = datetime.strptime(dtc,'%Y-%m-%d')
        if dat2 >= dtc:
            Item.loc[(Item.ID == id) & (Item.DATE == dat),"VER"] = ver
            continue
        else:
            pass

所以我嘗試的是這段代碼。 實際上這段代碼有效,但我認為它效率不高,因為它在大約 1~2 分鍾內給了我一個結果。 (200 個項目)。

您可以使用merge_asof 它按關鍵距離合並。 默認情況下,它使用“向后”搜索,選擇Ver中的最后一行,其“ver_date”小於或等於Item的“Date”(這是您的 if-else 條件正在檢查的內容)。

它還希望將鍵合並以進行排序; 所以您可以先將日期列轉換為日期時間對象,然后按它們對 DataFrames 進行排序:

Item['DATE'] = pd.to_datetime(Item['DATE'])
Ver['ver_date'] = pd.to_datetime(Ver['ver_date'])
out = (pd.merge_asof(Item.sort_values(by='DATE'), 
                     Ver.sort_values(by='ver_date'), 
                     left_on='DATE', right_on='ver_date')
       .drop(columns='ver_date')
       .sort_values(by='ID')
       .rename(columns={'version':'VER'}))

Output:

   ID       DATE  VER
3  A1 2021-07-05  1.1
4  A1 2021-08-01  1.2
1  A2 2021-02-02  1.1
2  A2 2021-02-03  1.1
0  A3 2021-01-01  1.1
5  B1 2021-10-12  1.3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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