Pandas:如果前两个列中的值是连续的,则在表中的两个新列中添加值?

时间:2016-12-30 20:18:54

标签: python sql pandas shift cumsum

所以,我试图在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;

左边的表格是我所拥有的,右边的表格是我想要实现的目标

enter image description here

1 个答案:

答案 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 maxg = 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>