Попробуйте следующий код:
df.groupby('subjID').apply(lambda grp: grp.pivot(
index='date', columns='var_names', values='var_values'))\
.rename_axis(columns=None).reset_index()
Изначально я думал о pivot с индексом, установленным в subjID и date , но к сожалению, pivot не подходит для такого случая.
Я обнаружил, что это ошибка, и о ней сообщили Pandas GitHub как о проблеме 21425 .
Итак, чтобы обойти это ограничение, я сгруппировал по subjID и затем назвал pivot с index = 'date' для каждой группы .
Чтобы увидеть необходимость rename_axis и reset_index , запустите мой код без этих функций, и разница должна быть очевидной.