【问题标题】:Pandas: add values to two new columns in table if values in two previous columns are continuous?Pandas:如果前两列中的值是连续的,则将值添加到表中的两个新列?
【发布时间】:2017-05-15 02:34:18
【问题描述】:

所以,我试图在 SQL 中完成此操作,但被告知在 Pandas 中会有一种简单的方法来完成此操作...感谢您的帮助/提示!

我目前在左侧的表格中有两列(开始子会话和结束子会话),我想添加左侧两列“会话开始”和“会话结束”。我知道如何简单地添加列,但是我无法弄清楚可以让我识别两个原始列中的连续值的查询(即结束子会话值与下一行开始子会话值相同)会话值),然后将第一个开始会话值和最后一个结束会话值(对于连续行)添加到我的新列中的相应行。请参考图片。例如,对于前三行,“结束子会话”值与下一行“开始子会话”值相同,因此前三个“会话开始”和“会话结束”将是相同,“开始子会话”值最小,“结束子会话”值最大。

我在 SQL 中尝试了一些类似的东西,显然没有用,我意识到聚合函数在这种情况下不起作用......

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

左边的表是我有的,右边的表是我想要实现的

【问题讨论】:

  • 抱歉,谢谢你看到这个,我附上了一张与我想象的不同的图片。

标签: python sql pandas shift cumsum


【解决方案1】:

您可以先将shifted 列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

然后groupby Series s transform minmax:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多