我試圖制作一個代碼來輸入專案的版本。有兩個資料框,一個帶有專案,一個帶有版本資訊。
這是一個虛擬資料和我制作的代碼:
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 個專案)。
uj5u.com熱心網友回復:
你可以使用merge_asof. 它按關鍵距離合并。默認情況下,它使用“向后”搜索,它選擇Ver“ver_date”小于或等于“日期”的最后一行Item(這是您的 if-else 條件正在檢查的內容)。
它還希望對要合并的鍵進行排序;因此您可以首先將日期列轉換為日期時間物件并按它們對 DataFrame 進行排序:
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'}))
輸出:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439642.html
標籤:Python python-3.x 熊猫 数据框 熊猫合并
