For correct ordering is necessary first convert column MONTH to ordered categoricals, then use DataFrame.pivot_table with margins paramter and last remove last row by DataFrame.iloc:
cats = ['January','February','March','April','May','June',
        'July','August','September','October','November','December']
df['MONTH'] = pd.Categorical(df['MONTH'], ordered=True, categories=cats)
df = df.pivot_table(index='NAME', 
                    columns='MONTH', 
                    values='HOURS',
                    margins=True, 
                    margins_name='TOTAL_HOURS',
                    fill_value=0,
                    aggfunc='sum').iloc[:-1]
print (df)
MONTH  January  February  August  TOTAL_HOURS
NAME                                         
John         5         3       0            8
Sarah        0         1       2            3
Last convert index to column:
df = df.reset_index().rename_axis(None, axis=1)
print (df)
    NAME  January  February  August  TOTAL_HOURS
0   John        5         3       0            8
1  Sarah        0         1       2            3