Pandas:如果前两列中的值是连续的,则将值添加到 table 中的两个新列?
Pandas: add values to two new columns in table if values in two previous columns are continuous?
所以,我试图在 SQL 中完成此操作,但被告知在 Pandas 中会有一种简单的方法来完成此操作...非常感谢您的 help/hints!
我目前在左侧有 table 两列(开始子会话和结束子会话),我想添加两个左边的列 "session start" 和 "session end"。我知道如何简单地添加列,但我无法弄清楚允许我识别两个原始列中的连续值的查询(即结束子会话值与下一行开始子 -会话值),然后将第一个开始会话值和最后一个结束会话值(对于连续行)添加到我的新列中的相应行。请参考图片。例如,对于前三行,"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;
左边的table是我有的,右边的table是我想达到的
您可以先比较下一个值 shift
ed column esub
with column bsub
if not equal (!=
) and then create groups by 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
by Series
s
with transform
min
和 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
所以,我试图在 SQL 中完成此操作,但被告知在 Pandas 中会有一种简单的方法来完成此操作...非常感谢您的 help/hints!
我目前在左侧有 table 两列(开始子会话和结束子会话),我想添加两个左边的列 "session start" 和 "session end"。我知道如何简单地添加列,但我无法弄清楚允许我识别两个原始列中的连续值的查询(即结束子会话值与下一行开始子 -会话值),然后将第一个开始会话值和最后一个结束会话值(对于连续行)添加到我的新列中的相应行。请参考图片。例如,对于前三行,"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;
左边的table是我有的,右边的table是我想达到的
您可以先比较下一个值 shift
ed column esub
with column bsub
if not equal (!=
) and then create groups by 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
by Series
s
with transform
min
和 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