Вычислить количество повторяющихся пар в столбце
Необходимо вычислить количество повторяющихся пар в столбце 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])
Спасибо за посильное участие!