Идея заключается в фильтрации строк по boolean indexing
с DataFrame.isin
для получения первых и последних вхождений некоторых событий, затем используйте GroupBy.agg
с first
и last
и изменить на DataFrame.unstack
, последнее сглаживание MultiIndex
в столбцах:
L = ['QBT','SBT']
df1 = (df[df['Event'].isin(L)]
.groupby(['OID','DID','CID','Event'])['TimeStamp']
.agg([('Last-DT','last'), ('First-DT','first')])
.unstack()
.sort_index(axis=1, level=1))
df1.columns = [f'Event-{b}-{a}' for a, b in df1.columns]
#print (df1)
Для первого и последнего вхождения используйте первое решение без фильтра, нет Event
в групповом режиме и нет unstack
:
df2 = (df.groupby(['OID','DID','CID'])['TimeStamp']
.agg([('FirstTimeUsage','first'), ('LastTime Usage','last')]))
#print (df2)
Последнее объединение DataFrame.join
вместе:
df = df1.join(df2).reset_index()
print (df)
OID DID CID Event-QBT-First-DT Event-QBT-Last-DT \
0 0 25078 14 2019-10-15 10:54:35 +0000 2019-10-15T16:02:16
Event-SBT-First-DT Event-SBT-Last-DT FirstTimeUsage \
0 2019-10-15 10:54:52 +0000 2019-10-15T15:29:02 2019-10-15 10:54:35 +0000
LastTime Usage
0 2019-10-15T16:02:16
РЕДАКТИРОВАТЬ: Для обработки следующего столбца немногоизменить генерировать df1
:
L = ['QBT','SBT']
df1 = (df[df['Event'].isin(L)]
.groupby(['OID','DID','CID','Event'])['TimeStamp']
.agg([('Last-DT','last'), ('First-DT','first')])
.unstack()
.sort_index(axis=1, level=1))
df1.columns = [f'Event-{b}-{a}' for a, b in df1.columns]
#print (df1)
L2 = ['ECS']
df11 = (df[df['Source'].isin(L2)]
.groupby(['OID','DID','CID','Source'])['TimeStamp']
.agg([('Last-DT','last'), ('First-DT','first')])
.unstack()
.sort_index(axis=1, level=1))
df11.columns = [f'Screen-{b}-{a}' for a, b in df11.columns]
df2 = (df.groupby(['OID','DID','CID'])['TimeStamp']
.agg([('FirstTimeUsage','first'), ('LastTime Usage','last')]))
и последний раз использовать concat
:
df = pd.concat([df1, df11, df2], axis=1).reset_index()
print (df)
OID DID CID Event-QBT-First-DT Event-QBT-Last-DT \
0 0 25078 14 2019-10-15 10:54:35 +0000 2019-10-15T16:02:16
Event-SBT-First-DT Event-SBT-Last-DT Screen-ECS-First-DT \
0 2019-10-15 10:54:52 +0000 2019-10-15T15:29:02 2019-10-15 11:00:01 +0000
Screen-ECS-Last-DT FirstTimeUsage LastTime Usage
0 2019-10-15 11:00:50 +0000 2019-10-15 10:54:35 +0000 2019-10-15T16:02:16