我有一个数据集,如下:
task = ['duty of care','informed consent','records management','conducting','experiments','positive reinforcement','developing','rapport' ]
start = [ 21, 24, 26, 60, 61, 80,98,99 ]
end = [ 24, 26, 28, 61, 62, 82,99,100]
dat = pd.DataFrame({'task': task, 'start':start, 'end': end})
dat
我要完成的是这个
dat.end[i] == dat.start[i+1]
则聚合dat.task
dat.end[i] != dat.start[i+1]
不执行任何操作所需的输出应如下所示。
答案 0 :(得分:4)
如果它们是块的一部分,我们将需要一种将它们组合在一起的方法。首先,让我们找出开始时间不等于下一个项目结束时间的所有时间。如果项目是块中的第一个项目,则此系列为True,否则为false。
temp = (dat['start'] != dat['end'].shift(1))
它看起来像这样:
0 True
1 False
2 False
3 True
4 False
5 True
6 True
7 False
然后我们可以求和。当您对“真/假”执行此操作时,“真”会将总和加1,而“假”不会更改它。这很有用,因为它然后为我们提供了一个分组 -您最初要组合的每个块都有自己的编号。
groups = temp.cumsum()
看起来像:
0 1
1 1
2 1
3 2
4 2
5 3
6 4
7 4
现在我们快到了。对于每个组,您都希望获取最小开始,最大结束并连接所有文本。
datg = dat.groupby(groups)
out = pd.DataFrame({
'task': datg['task'].apply(' '.join),
'start': datg['start'].min(),
'end': datg['end'].max(),
})
得出的最终结果是:
task start end
1 duty of care informed consent records management 21 28
2 conducting experiments 60 62
3 positive reinforcement 80 82
4 developing rapport 98 100
将其全部放在一个位置:
temp = (dat['start'] != dat['end'].shift(1))
groups = temp.cumsum()
datg = dat.groupby(groups)
out = pd.DataFrame({
'task': datg['task'].apply(' '.join),
'start': datg['start'].min(),
'end': datg['end'].max(),
})
答案 1 :(得分:1)
IIUC,您可以先使用cumsum
和groupby
创建一个新列:
df = pd.DataFrame({'task': task, 'start':start, 'end': end})
df["count"] = (df["start"]-df["end"].shift(1)).fillna(0).ne(0).cumsum()
print (df.groupby("count").agg({"task":"first","start":"min","end":"max"}))
task start end
count
0 duty of care 21 28
1 conducting 60 62
2 positive reinforcement 80 82
3 developing 98 100