df = pd.DataFrame({'D0': ['0', 'A', 'B', 'C'], 'D1': ['B', '0', 'C', 'D'],
    'D2': ['C', 'D', '0', 'A']})
df = df.replace('0', np.nan)
code = df.stack()
code.index = code.index.droplevel(1)
code.name = 'code'
code = code.to_frame()
pair = code.join(code, rsuffix='_2')
freq = pd.crosstab(pair['code'], pair['code_2'])
Попарная таблица частот для нескольких столбцов в Python