根据熊猫中的条件汇总(联接)文本列

时间:2020-06-19 03:35:17

标签: 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.DataFrame({'task': task, 'start':start, 'end': end})
dat

enter image description here

我要完成的是这个

  1. 如果dat.end[i] == dat.start[i+1]则聚合dat.task
  2. 如果dat.end[i] != dat.start[i+1]不执行任何操作

所需的输出应如下所示。

enter image description here

2 个答案:

答案 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,您可以先使用cumsumgroupby创建一个新列:

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