2016-12-30 43 views
-2

所以,我試圖在SQL中完成這一點,但被告知會有一個簡單的方法來做到這一點熊貓...我會感謝您的幫助/提示!熊貓:如果前兩列中的值是連續的,則將值添加到表中的兩個新列中?

我目前有兩列左邊的表(開始子會話和結束子會話),我想添加兩個左列「會話開始」和「會話結束」。我知道如何簡單地添加列,但我無法弄清楚這個查詢是否會允許我識別兩個原始列中的連續值(即,最終子會話值與下一行開始子列的值相同)會話值),然後將第一個開始會話值和最後一個結束會話值(對於連續行)添加到新列中的相應行。例如,前三行「end subsession」值與下一行「begin subsession」值相同,因此前三個「會話開始」和「會話結束」將是與「開始子會話」值和最大「結束子會話」值的最小值相同。

我試圖沿着SQL這些方針的東西,顯然沒有工作,我實現了聚合函數不會在這種情況下工作...

SELECT 
FROM viewershipContinuous = 
    CASE 
     WHEN endSubsession.ROWID = beginSubession.ROWID+1 
     THEN MIN(beginSubsession) 
     ELSE beginSubsession.ROWID+1 
     END; 

左邊的表是什麼我有,右邊的表是我想要實現

enter image description here

+0

我很困惑... –

+0

對不起,謝謝你抓住這一點,我附與我想象不同的圖像。 – user7351553

回答

1

您可以先通過shift編列esub與如果不相等bsub列比較下一個值(什麼通過Seriess

s = df['bsub'].ne(df['esub'].shift()).cumsum() 
print (s) 
0 1 
1 1 
2 1 
3 2 
4 2 
5 2 
6 2 
7 3 
8 3 
dtype: int32 

然後groupbytransformminmax:),然後通過cumsum創建組

g = df.groupby(s) 
df['session start'] = g['bsub'].transform('min') 
df['session end'] = g['esub'].transform('max') 
print (df) 
    bsub esub session start session end 
0 1700 1705   1700   1800 
1 1705 1730   1700   1800 
2 1730 1800   1700   1800 
3 1900 1920   1900   1965 
4 1920 1950   1900   1965 
5 1950 1960   1900   1965 
6 1960 1965   1900   1965 
7 2000 2001   2000   2002 
8 2001 2002   2000   2002 
+0

是的,謝謝! – user7351553

相關問題