簡體   English   中英

使用 python 中的兩個數字合並或連接兩個數據集

[英]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 和在不起作用的函數之間。

您可以采用df1df2的笛卡爾積,然后僅過濾重疊間隔,並計算持續時間:

# 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.

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