Построить матрицу совместного появления из списка в Python - PullRequest
0 голосов
/ 19 декабря 2018

Предположим, у нас есть n списков, состоящих из нескольких значений.

['a', 'b']
['b', 'c', 'd', 'e']
['a', 'd', 'e']
['b', 'e']

Здесь n = 4.

Это должно привести к кадру данных, подобному приведенному ниже

      'a'  'b'  'c'  'd'  'e'
'a'    0    1    0    1    1
'b'    1    0    1    1    2
'c'    0    1    0    1    1
'd'    1    1    1    0    2
'e'    1    2    1    2    0

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вот способ сделать это:

l1=['a', 'b']
l2=['b', 'c', 'd', 'e']
l3=['a', 'd', 'e']
l4=['b', 'e']

Получить вложенный список из списков:

l = [i for i in [l1,l2,l3,l4]]

Получить все комбинации в каждом списке, используя itertools.combinations:

c = [list(itertools.combinations(i,2)) for i in l]
#[[('a', 'b')],
#[('b', 'c'), ('b', 'd'), ('b', 'e'), ('c', 'd'), ('c', 'e'), ('d', 'e')],
#[('a', 'd'), ('a', 'e'), ('d', 'e')],
#[('b', 'e')]]

Сгладить вложенные списки.Обратите внимание, что каждый элемент добавляется в исходном и обратном порядке, используя chain.from_iterable((i, i[::-1]).

a = list(chain.from_iterable((i, i[::-1]) for c_ in c for i in c_))

Используйте pivot_table и агрегируйте по size, чтобы сгенерировать матрицу совпадений из результата

df = pd.DataFrame(a)
pd.pivot_table(df, index=0, columns=1, aggfunc='size', fill_value=0)

1    a    b    c    d    e
0                         
a  0.0  1.0  0.0  1.0  1.0
b  1.0  0.0  1.0  1.0  2.0
c  0.0  1.0  0.0  1.0  1.0
d  1.0  1.0  1.0  0.0  2.0
e  1.0  2.0  1.0  2.0  0.0
0 голосов
/ 19 декабря 2018
lst = [
    ['a', 'b'],
    ['b', 'c', 'd', 'e'],
    ['a', 'd'],
    ['b', 'e']
]

Вы можете использовать get_dummies + groupby и sum, за которыми следует dot продукт:

u = (pd.get_dummies(pd.DataFrame(lst), prefix='', prefix_sep='')
       .groupby(level=0, axis=1)
       .sum())

v = u.T.dot(u)
v.values[(np.r_[:len(v)], ) * 2] = 0

print(v)
   a  b  c  d  e
a  0  1  0  1  0
b  1  0  1  1  2
c  0  1  0  1  1
d  1  1  1  0  1
e  0  2  1  1  0

Подробности
Сначала загрузите ваш фрейм данных.

pd.DataFrame(lst)

   0  1     2     3
0  a  b  None  None
1  b  c     d     e
2  a  d  None  None
3  b  e  None  None

Затем сгенерируйте однозначное кодирование для этих значений.Это первый шаг для вычисления количества совпадений.

pd.get_dummies(_, prefix='', prefix_sep='')

   a  b  b  c  d  e  d  e
0  1  0  1  0  0  0  0  0
1  0  1  0  1  0  0  1  1
2  1  0  0  0  1  0  0  0
3  0  1  0  0  0  1  0  0

Далее, объедините столбцы по заголовку и сосчитайте их.

_.groupby(level=0, axis=1).sum()

   a  b  c  d  e
0  1  1  0  0  0
1  0  1  1  1  1
2  1  0  0  1  0
3  0  1  0  0  1

u = _

Далее вычислите кросс-табуляцию с помощьюскалярное произведение.

u.T.dot(u)

   a  b  c  d  e
a  2  1  0  1  0
b  1  3  1  1  2
c  0  1  1  1  1
d  1  1  1  2  1
e  0  2  1  1  2

v = _

Наконец, установите диагональ на 0.

v.values[(np.r_[:len(v)], ) * 2] = 0
v

   a  b  c  d  e
a  0  1  0  1  0
b  1  0  1  1  2
c  0  1  0  1  1
d  1  1  1  0  1
e  0  2  1  1  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...