我有一个数据框
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万行的数据帧上有效工作的解决方案。干杯。
答案 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