Since you've tagged the question with plotly and not gotten a plotly answer yet, here's how I would do it:
Plot 1:

Code 1:
# imports import plotly.graph_objects as go from plotly.offline import iplot import pandas as pd import numpy as np # intialise data of lists. data = {'Name':['Nick hospital', 'Nick hospital','Nick hospital', 'Krish hospital', 'Krish hospital','Krish hospital'], 'NAR_forms_used':[2, 1,2, 2, 2,3] } # Create DataFrame df = pd.DataFrame(data) # get counts per NAR type df_nar=pd.DataFrame(df.groupby('Name')['NAR_forms_used'].value_counts()) df_nar=df_nar.rename({'NAR_forms_used': 'NAR count'}, axis='columns') df_nar=df_nar.reset_index() # Manage NAR types (who knows, there may be more types with time?) nars = df_nar['NAR_forms_used'].unique() nars = nars.tolist() nars.sort(reverse=False) # set up plotly figure fig = go.Figure() # add one trace per NAR type and show counts per hospital for nar in nars: # subset dataframe by NAR type df_ply=df_nar[df_nar['NAR_forms_used']==nar] # add trace fig.add_trace(go.Bar(x=df_ply['Name'], y=df_ply['NAR count'], name='NAR Type='+str(nar))) # make the figure a bit more presentable fig.update_layout(title='NAR per hospital', yaxis=dict(title='<i>count of NAR types</i>'), xaxis=dict(title='<i>Hospital</i>', ) ) fig.show()
As you probably know, there is no NAR type 3 for Nick Hospital and no NAR type 1 for Krish Hospital, so that's why the figure might seem a little strange at first glance. It all makes sense when you add some more data to your sample:
Plot 2:

Code 2:
# imports import plotly.graph_objects as go from plotly.offline import iplot import pandas as pd import numpy as np # intialise data of lists. data = {'Name':['Nick hospital', 'Nick hospital', 'Nick hospital', 'Nick hospital','Nick hospital', 'Nick hospital', 'Krish hospital', 'Krish hospital','Krish hospital', 'Krish hospital'], 'NAR_forms_used':[3, 3, 3, 2, 1, 2, 2, 2, 3, 1] } # Create DataFrame df = pd.DataFrame(data) # get counts per NAR type df_nar=pd.DataFrame(df.groupby('Name')['NAR_forms_used'].value_counts()) df_nar=df_nar.rename({'NAR_forms_used': 'NAR count'}, axis='columns') df_nar=df_nar.reset_index() # Manage NAR types (who knows, there may be more types with time?) nars = df_nar['NAR_forms_used'].unique() nars = nars.tolist() nars.sort(reverse=False) # set up plotly figure fig = go.Figure() # add one trace per NAR type and show counts per hospital for nar in nars: # subset dataframe by NAR type df_ply=df_nar[df_nar['NAR_forms_used']==nar] # add trace fig.add_trace(go.Bar(x=df_ply['Name'], y=df_ply['NAR count'], name='NAR Type='+str(nar))) # make the figure a bit more presentable fig.update_layout(title='NAR per hospital', yaxis=dict(title='<i>count of NAR types</i>'), xaxis=dict(title='<i>Hospital</i>', ) ) fig.show()