Вычисление перекрытия между категориальными переменными в одном DataFrame в Python - PullRequest
1 голос
/ 07 августа 2020

Я работаю над своей дипломной работой, и у меня есть вопрос по части моего кода. Я пытаюсь подсчитать, сколько раз каждая пара столбцов в df имеет одинаковое значение. Все столбцы являются двоичными (0, 1).

Входные данные имеют следующий формат:

df = pd.DataFrame([[1, 0, 1], [0, 0, 1]], columns = ["col1", "col2"])

Например, количество раз col1 и col2 имел такое же значение в приведенном выше фрагменте - 3.

Это код, который у меня есть до сих пор

bl1 = []
bl2 = []
overlap = []

for i in df.iterrows():
    for j in range(len(df.columns)):
        for k in range(j):
            a = df.iloc[j] 
            b = df.iloc[k]
            
            comparison_column = np.where(a == b)
            
            bl1.append(df.columns[j])            
            bl2.append(df.columns[k])
            overlap.append(len(comparison_column[0]))

После объединения списков в pd.Dataframe результат выглядит следующим образом

Base Learner 1 Base Learner 2  overlap
         col1         col2       2

Я знаю, что код не работает, потому что я подсчитал в Excel и получил разные результаты для подсчета перекрытий. Я подозреваю, что петли не суммируют количество раз, когда пара была обнаружена в части df.iterrows(), но я не знаю, как это исправить. Пожалуйста, дайте мне любые предложения, которые вы можете. Спасибо.

1 Ответ

1 голос
/ 07 августа 2020

Попробуем маги c умножение матриц:

(df.T @ df) + ((1-df.T)@(1-df))

Вывод:

        Rule21  Rule22  Rule23  Rule24
Rule21       5       5       4       2
Rule22       5       5       4       2
Rule23       4       4       5       3
Rule24       2       2       3       5

Пояснение: df.T @ df подсчитывается, если соответствующие ячейки в обоих столбцах равны 1. Точно так же ((1-df.T)@(1-df)) считается, если оба столбца - 0.

...