[英]Merge or join two datasets using between two numbers in python
我有兩個數據集;
試圖在 df1(查看的數據)上合並 df2(內容數據)。 必須使用合並。 但是,密鑰不是標准的,而應該是中間鍵。
df1 = pd.DataFrame({"ID": [1, 2],"start":[7200, 1000],"end":[7400, 1100],"duration":[200, 100]})
df2 = pd.DataFrame({"Prog_start":[7100,7300,980,1050],"Prog_end":[7300,7400,1050,1150],"Prog":["Prog_1","Prog_2","Prog_3","Prog_4"]})
desired_output=pd.DataFrame({"ID":[1,1,2,2],"start":[7200,7200,1000,1000],"end":[7400,7400,1100,1100],"duration":[200,200,100,100],"Prog_start":[7100,7300,980,1050],"Prog_end":[7300,7400,1050,1150],"Prog":["Prog_1","Prog_2","Prog_3","Prog_4"],"Dur_Prog":[100,100,20,50]})
我嘗試過使用 iloc 和在不起作用的函數之間。
您可以采用df1
和df2
的笛卡爾積,然后僅過濾重疊間隔,並計算持續時間:
# cartesian product and interval filtering
z = (df1
.assign(k=1).merge(df2.assign(k=1), on='k')
.query('(Prog_start < end) & (Prog_end > start)')
.drop(columns='k'))
# duration calculation
z['Duration_Prog'] = (np.clip(z['Prog_end'], z['start'], z['end']) -
np.clip(z['Prog_start'], z['start'], z['end']))
z
Output:
ID start end duration Prog_start Prog_end Prog Duration_Prog
0 1 7200 7400 200 7100 7300 Prog_1 100
1 1 7200 7400 200 7300 7400 Prog_2 100
6 2 1000 1100 100 980 1050 Prog_3 50
7 2 1000 1100 100 1050 1150 Prog_4 50
PS你的desired_output
的第3行有錯誤嗎? 如果我正確理解邏輯,它應該是Duration_Prog = 50
(重疊是1000 - 1050
)
PPS 使用較新的pandas
(1.2.0+),您可以使用merge
with how='cross'
進行笛卡爾連接,不需要臨時k
列
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.