Вычислить количество повторяющихся пар в столбце

Необходимо вычислить количество повторяющихся пар в столбце name:

d = {'name': ['rick, mike, morty', 'tot, piter, carl', 'brick, nick', 'rick, reaven, bart, homer', 'rick, morty'],
     'Date': ['11/05/2011', '9/02/2010', '1/01/2014', '12/20/2020', '9/30/2009'],
     'Address': ['AR', 'YU', 'RU', 'EU', 'BY']}
df = pd.DataFrame(data = d)

Ответ должен выглядеть как:

name inp
rick, morty 2

Нет ли другого выхода, кроме как использовать функцию for и combinations? Ну, или хотя бы без for)


Ответы (3 шт):

Автор решения: A_Vaclav

Это не полный ответ. Пример кода, который дает список повторений 2 и более раз. На его основании можно построить правило отбора...

import pandas as pd

d = {'name': ['rick, mike, morty', 'tot, piter, carl', 'brick, nick',
              'rick, reaven, bart, homer', 'rick, morty'],
     'Date': ['11/05/2011', '9/02/2010', '1/01/2014',
              '12/20/2020', '9/30/2009'],
     'Address': ['AR', 'YU', 'RU', 'EU', 'BY']}
df = pd.DataFrame(data = d)
#добавим новый столбец, в котором строку с именами преобразуем
#в лист с именами
df['lists_name'] = df['name'].str.split(',')

def get_list_repeats_name(arr):
    #arr - серия из списка списков
    list_name = [y for x in arr for y in x]
    set_name = set(list_name)
    return [x for x in set_name if list_name.count(x) >= 2]

print(get_list_repeats_name(df['lists_name']))

>>>['rick', ' morty']
→ Ссылка
Автор решения: SergFSM

вместо цикла for можно использовать встроенную функцию map, примерно так:

from itertools import combinations,chain
from collections import Counter
import pandas as pd

d = {'name': ['rick, mike, morty', 'tot, piter, carl', 'brick, nick', 'rick, reaven, bart, homer', 'morty, rick'],
     'Date': ['11/05/2011', '9/02/2010', '1/01/2014', '12/20/2020', '9/30/2009'],
     'Address': ['AR', 'YU', 'RU', 'EU', 'BY']}
c = Counter(chain(*map(lambda x: combinations(sorted(x.split(', ')),2), d['name'])))
df = pd.DataFrame({'names': c.keys(), 'inp':c.values()})
df = df[df.inp>1].set_index('names')

вывод:

              inp
names   
(morty, rick)   2
→ Ссылка
Автор решения: lerm_on_t_off

C помощью коллективного разума решение найдено):

d = {'name': ['mike, rick, morty', 'tot, piter, carl', 'brick, nick', 'rick, reaven, bart, homer', 'rick, morty'], 'Date': ['11/05/2011', '9/02/2010', '1/01/2014', '12/20/2020', '9/30/2009'], 'Address': ['AR', 'YU', 'RU', 'EU', 'BY']}
df = pd.DataFrame(data = d)
df['name'] = df.name.str.split(',\s*')
df['gr'] = df.name.apply(lambda x: list(combinations(x, 2)))
df = df.explode('gr')
df['gr'] = df.gr.str.join(',')
display(df.gr.value_counts().index[0])

Спасибо за посильное участие!

→ Ссылка