Вы можете использовать df.melt
с groupby+agg
:
final = (df.replace('Null',np.nan).melt(['id','col'],value_name='new_col').groupby('id'
,as_index=False).agg({'new_col':lambda x: x.dropna().tolist(),'col':'first'}))
Или stack
сначала с set_index
затем groupby+agg
final1 = (df.replace('Null',np.nan).set_index(['id','col']).stack().rename('new_col')
.reset_index('col').groupby(level=0).agg({'new_col':list,'col':'first'}))
id new_col col
0 a [1, 2, 2, 2, 3] 'aa'
1 b [4, 3, 1] 'bb'
2 c [1, 2, 3] 'gg'