所以,我试图在SQL中完成这个,但是被告知在Pandas中有一个简单的方法可以做到这一点......我将非常感谢你的帮助/提示!
我目前左边的表有两列(开始子会话和结束子会话),我想添加两个左栏“会话开始”和“会话结束”。我知道如何简单地添加列,但我无法弄清楚允许我在两个原始列中识别连续值的查询(即,最终子会话值与下一行开始子列相同 - 会话值)然后将第一个开始会话值和最后结束会话值(对于连续行)添加到我的新列中的相应行。请参考图像..例如,对于前三行,“end subsession”值与下一行“begin subsession”值相同,因此前三个“session start”和“session end”将是同样,使用“begin subsession”值和最大“end sub session”值的最小值。
我在SQL中尝试了这些方面的东西,显然没有用,我意识到聚合函数在这种情况下不起作用......
SELECT
FROM viewershipContinuous =
CASE
WHEN endSubsession.ROWID = beginSubession.ROWID+1
THEN MIN(beginSubsession)
ELSE beginSubsession.ROWID+1
END;
左边的表格是我所拥有的,右边的表格是我想要实现的目标
答案 0 :(得分:1)
您可以先将shift
ed列esub
的下一个值与列bsub
进行比较,如果不相等(!=
),然后按cumsum
创建组:
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
然后Series
s
min
groupby
max
和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
:
<form action='cancel.jsp'>
<input type='submit' name='cancel' value='Cancel Reservation'>
</form>