Using cross_tab
df.stack().pipe(lambda s: pd.crosstab(s, s.index.get_level_values(1)))
col_0 2015 2016 2017
row_0
A 0 1 2
AA 2 2 1
AAA 1 0 0
WITH get_dummies
pd.get_dummies(df.values.ravel()).T.dot(
pd.get_dummies(df.columns.repeat(len(df)))
)
2015 2016 2017
A 0 1 2
AA 2 2 1
AAA 1 0 0
source
share