Python 基于表中的条件聚合(联接)文本列
我的数据集如下:Python 基于表中的条件聚合(联接)文本列,python,pandas,aggregate,Python,Pandas,Aggregate,我的数据集如下: 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.DataFram
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.启动[i+1]
什么也不做如果它们是块的一部分,我们需要一种方法将它们组合在一起。首先,让我们找出开始不等于下一项结束的所有时间。如果项目是块中的第一个,则此系列为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(),
})
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
您可以将
apply(“.join)
替换为agg(“.join)
。我想会快一点。但从未真正测试过