Python:pandas groupby ID,添加多列的值直到满足中断条件

时间:2018-09-10 12:01:02

标签: python pandas pandas-groupby

我有一个数据框

df = pd.DataFrame({ 'id': ['1','1','1','2','2','3','4'],
'transfer_time': [0,10,12,0,19,0,0],
'trip_time': [20,30,9,10,15,12,16],
'is_final_stop': [0,1,0,0,1,1,1]
})
print(df)

如下所示:

id  is_final_stop   transfer_time   trip_time
1   0                 0               20
1   1                 10              30
1   0                 12              9
2   0                 0               10
2   1                 19              15
3   1                 0               12
4   1                 0               16

我需要计算travel_time = transfer_time + trip_time,按ID分组,直到is_final_stop标志=1。(不应将此实例之后的ID视为添加到trip_time中)

解决方案应如下所示:

id journey_time
1  60
2  44
3  12
4  16

将赞赏一种可以在具有400万行的数据帧上有效工作的解决方案。干杯。

2 个答案:

答案 0 :(得分:2)

通过 reverse cumsum计算“包含”标志,然后在总计时间上使用GroupBy + sum

inc_flag = df.iloc[::-1].groupby('id')['is_final_stop'].cumsum().iloc[::-1].astype(bool)

res = df[inc_flag].groupby('id')[['transfer_time', 'trip_time']].sum().sum(1)\
                  .rename('total_time').reset_index()

结果:

  id  total_time
0  1          60
1  2          44
2  3          12
3  4          16

答案 1 :(得分:1)

您可以通过groupby-apply和自定义函数来解决此问题:

def func(g):
    return g[g['is_final_stop'].cumsum().cumsum() < 2][['trip_time', 'transfer_time']].sum().sum()

df2 = df.groupby('id').apply(func).rename('total_time').reset_index()
#   id  total_time
# 0  1          60
# 1  2          44
# 2  3          12
# 3  4          16