Вот новое решение, которое будет работать со всеми комбинациями
Шаги:
- получить «группированный» фрейм данных, который группирует / перечисляет все группы, в которых находится элемент
- из каждой строки сгруппированных получить все возможные комбинации группы, которая имеет некоторые общие элементы
- из «группированного» подсчета данных для каждой комбинации, если есть 2 или более общих элементов, добавьте это в словарь
Примечание : он только перебирает групповые комбинации, которые имеют общие элементы, поэтому, если у вас много групп, он уже отфильтровывает огромную часть возможных комбинаций, у которых нет общих элементов
import numpy as np
import pandas as pd
from itertools import combinations
d = {
"Group": "A,A,A,B,B,C,D,D".split(","),
"Item": [1,2,3,1,3,1,2,3]
}
df = pd.DataFrame(d)
grouped = df.groupby("Item").apply(lambda x: list(x.Group))
all_combinations_with_common = [sorted(combinations(item, i)) for item in grouped
for i in range(2, len(item)) if len(item)>=2]
all_combinations_with_common = np.concatenate(all_combinations_with_common)
commons = {}
REPEAT_COUNT = 2
for comb in all_combinations_with_common:
items = grouped.apply(lambda x: np.all(np.in1d(comb, x)))
if sum(items)>=REPEAT_COUNT:
commons["-".join(comb)] = grouped[items].index.values
display(commons)
выход
{'A-B': array([1, 3]), 'A-D': array([2, 3])}