Я думаю, вы можете использовать set_index
с stack
и unstack
для изменения формы:
df = df_strip.set_index(['Name','ID']).stack().unstack(1)
#create one column from MultiIndex with join
df.index = df.index.map('_'.join)
df = df.rename_axis('ID').rename_axis(None, 1).reset_index()
print (df)
ID BE1 BE2 DE1
0 Amanda_Birth_date 18/05/2011 06:08 18/05/2011 04:44 18/05/2011 12:08
1 Amanda_Age 25 35 36
2 John_Birth_date 18/05/2011 06:55 18/05/2011 06:45 18/05/2011 03:11
3 John_Age 21 22 42
#create new columns by names and values
df = df_strip.set_index(['Name','ID']).stack().unstack(1)
df = df.rename_axis(('Name','Type')).rename_axis(None, 1).reset_index()
print (df)
Name Type BE1 BE2 DE1
0 Amanda Birth_date 18/05/2011 06:08 18/05/2011 04:44 18/05/2011 12:08
1 Amanda Age 25 35 36
2 John Birth_date 18/05/2011 06:55 18/05/2011 06:45 18/05/2011 03:11
3 John Age 21 22 42
А для вашего точно выхода:
df = df_strip.set_index(['Name','ID']).stack().unstack(1)
df.index = ['{}'.format(i) if j == 'Birth_date' else '{}'.format(j) for i, j in df.index]
df = df.rename_axis('Name').rename_axis(None, 1).reset_index()
print (df)
Name BE1 BE2 DE1
0 Amanda 18/05/2011 06:08 18/05/2011 04:44 18/05/2011 12:08
1 Age 25 35 36
2 John 18/05/2011 06:55 18/05/2011 06:45 18/05/2011 03:11
3 Age 21 22 42