Наиболее эффективный вариант - использовать np.unique
с установленным флагом return_counts
:
u, c = np.unique(df, return_counts=True)
pd.Series(c, index=u)
Также есть stack
и value_counts
, что намного медленнее, но просто и интуитивно понятно:
df.stack().value_counts()