If I understand your question correctly, this should help:
df.b.value_counts() / len(df)
Remember: Count gives you number of non-null or non-empty rows in the column. This is not always equal to number of rows.
Thank you GPS. This is what i was looking for. The values_counts() has same result as i was geting from group_by() + count() except not all columns.
What I am rying to solve is : "What proportion of rows occur in the column 'b' with the largest number of 'b'?"
Is the approach correct or do i need to apply some other formula?