IIU C, DataFrame.melt
+ DataFrame.pivot_table
. pd.factorize
и Series.map
, чтобы легко получить имена столбцов после поворота.
df2 = (df.rename(columns = {'source' : 'day', 'event' : 'd'})
.assign(time=pd.factorize(df['time'])[0]+1)
.melt(['enroll_id', 'time']))
new_df = (df2.pivot_table(index='enroll_id',
columns=['value', 'variable', 'time'],
aggfunc='size')
.sort_index(level=[2, 1, 0],
ascending=[True, True, False],
axis=1))
new_df = (new_df.set_axis([f'{x}_{y}{z}' for x, y, z in new_df.columns], axis=1)
.reset_index())
print(new_df)
enroll_id view_d1 access_d1 server_day1 browser_day1 view_d2 \
0 1 1.0 NaN 1.0 NaN NaN
1 2 NaN 1.0 NaN 1.0 1.0
discuss_d2 server_day2 browser_day2 view_d3 browser_day3 discuss_d4 \
0 1.0 1.0 NaN 1.0 1.0 1.0
1 NaN NaN 1.0 NaN NaN NaN
server_day4
0 1.0
1 NaN