Лучший способ вычислить совместные вхождения в Пандах - PullRequest
3 голосов
/ 12 июля 2019

У меня есть фрейм данных с булевыми столбцами, каждый из которых указывает, принадлежит ли запись категории:

import pandas as pd

example = pd.DataFrame({
    "is_a": [True, False, True, True],
    "is_b": [False, False, False, True],
    "is_c": [True, False, False, True],
})

пример:

    is_a    is_b    is_c
0   True    False   True
1   False   False   False
2   True    False   False
3   True    True    True

Я хочу посчитать количество совпадений между каждой парой категорий. В настоящее время я делаю это:

cols = ["is_a", "is_b", "is_c"]
output = pd.DataFrame(
    {x: [(example[x] & example[y]).sum() for y in cols] for x in cols},
    index=cols,
)

Выход:

     is_a is_b is_c
is_a    3    1    2
is_b    1    1    1
is_c    2    1    2

Это дает мне правильный вывод, но мне интересно, если кто-то думает, что они нашли лучшее решение для этой проблемы.

Ответы [ 3 ]

5 голосов
/ 12 июля 2019

dot

Это метод Панды pandas.DataFrame.dot, использующий оператор @.

(lambda d: d.T @ d)(example.astype(int))

      is_a  is_b  is_c
is_a     3     1     2
is_b     1     1     1
is_c     2     1     2

То же самое, но вместо ndarray 1011*

a = example.to_numpy().astype(int)
pd.DataFrame(a.T @ a, example.columns, example.columns)

      is_a  is_b  is_c
is_a     3     1     2
is_b     1     1     1
is_c     2     1     2
1 голос
/ 12 июля 2019

Я буду использовать numpy вещание

s=example.values.T
np.sum(s&s[:,None],2)
array([[3, 1, 2],
       [1, 1, 1],
       [2, 1, 2]])

Конвертировать в фрейм данных

pd.DataFrame(np.sum(s&s[:,None],2),columns=example.columns,index=example.columns)
      is_a  is_b  is_c
is_a     3     1     2
is_b     1     1     1
is_c     2     1     2
1 голос
/ 12 июля 2019

Мы можем использовать матричное умножение, чтобы решить эту проблему.

import numpy as np
import pandas as pd

example = pd.DataFrame({
    "is_a": [True, False, True, True],
    "is_b": [False, False, False, True],
    "is_c": [True, False, False, True],
})

encoded_example = example.astype(int)

output = pd.DataFrame(
    np.dot(encoded_example.T, encoded_example),
    index=encoded_example.columns,
    columns=encoded_example.columns
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...