专业
Chemistry 180 174
Marketing 170 0
Physics 0 165.5
# pd.options.display.precision = 0 # 取整的后果 165.5显示成166
df.groupby(['专业','班级']).mean().unstack().fillna(0) # fillna(0) 用0替代NaN
'''--result
身高
班级 1 2
专业
Chemistry 180 174
Marketing 170 0
Physics 0 166
'''
花了大半时间才发现你的marketing有一个拼错了。如果完全要按你的格式输出,应该用的是poivt_table
pd.pivot_table(df,index='专业',columns='班级',values='身高',fill_value=0).astype('int64')