Использование:
#convert column to datetimes if necessary
df['timestamp'] = pd.to_datetime(df['timestamp'])
#aggregate min and max
df1 = df.groupby('session_id')['timestamp'].agg(['min','max'])
#subtract to new column
df1['timeSpent'] = df1.pop('max') - df1.pop('min')
df1 = df1.reset_index()
print (df1)
session_id timeSpent
0 sess1 00:00:00
1 sess2 00:21:44.118000
2 sess3 00:00:00
Решение на одну строку с GroupBy.agg
и кортежем:
df1 = (df.groupby('session_id')['timestamp']
.agg([('timeSpent', lambda x: x.max() - x.min())])
.reset_index())
print (df1)
session_id timeSpent
0 sess1 00:00:00
1 sess2 00:21:44.118000
2 sess3 00:00:00
Если необходимо вывести в секундах, конвертируйте timedeltas в Series.dt.total_seconds
:
df1['timeSpent'] = (df1.pop('max') - df1.pop('min')).dt.total_seconds()
df1 = df1.reset_index()
print (df1)
session_id timeSpent
0 sess1 0.000
1 sess2 1304.118
2 sess3 0.000
Решение для одной строки:
df1 = (df.groupby('session_id')['timestamp']
.agg([('timeSpent', lambda x: x.max() - x.min())])
.assign(timeSpent = lambda x: x['timeSpent'].dt.total_seconds())
.reset_index())
print (df1)
session_id timeSpent
0 sess1 0.000
1 sess2 1304.118
2 sess3 0.000