![](/img/trans.png)
[英]Update values with earlier date based on list by another dataframe in Python
[英]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.