using pandas you can do approximately what I think you want
NG1={'need1': {'good1': 3, 'good2': 4}, 'need2': {'good2': 2, 'good3': 2}}
NG2={'need1': {'good1': 13, 'good2': 23}, 'need2': {'good2': 8, 'good3': 14}}
(notice the lack of [])
combined_df = pd.concat({'ng1': pd.DataFrame(NG1), 'ng2': pd.DataFrame(NG2)}).unstack(0)
combined_df
need1 need2
ng1 ng2 ng1 ng2
good1 3.0 13.0 NaN NaN
good2 4.0 23.0 2.0 8.0
good3 NaN NaN 2.0 14.0
Depending on what exactly it is you want you can omit the unstack
combined_df.plot.bar()
delivers

edit update
I cannot create exactly what you need in this way, You would need to play around with different glyphs and figures and I don't have the skills or time to do this, but I can provide the data in the correct way
combined_df = pd.concat({'ng1': pd.DataFrame(NG1), 'ng2': pd.DataFrame(NG2)}).stack()
combined_df.index.names = ['ng', 'good', 'need']
combined_df = combined_df.unstack(['good'])
combined_df['sum'] = combined_df.sum(axis=1)
combined_df
good good1 good2 good3 sum
ng need
ng1 need1 3.0 4.0 NaN 7.0
need2 NaN 2.0 2.0 4.0
ng2 need1 13.0 23.0 NaN 36.0
need2 NaN 8.0 14.0 22.0
combined_df.plot.bar()
