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)
    。我想会快一点。但从未真正测试过