У меня есть датафрейм (но это также могут быть просто наборы / списки):

Group    Letter      
  1    {a,b,c,d,e}
  2    {b,c,d,e,f}
  3    {b,c,d,f,g}
  4    {a,b,c,f,g}
  5    {a,c,d,e,h}

Я хочу добавить столбец с пересечением групп 1-2, 1-2-3, 1-2-3-4, 1-2-3-4-5. Так будет что-то вроде этого:

Group    Letter      Intersection 
  1    {a,b,c,d,e}       None
  2    {b,c,d,e,f}     {b,c,d,e}
  3    {b,c,d,f,g}      {b,c,d}
  4    {a,b,c,f,g}       {b,c}
  5    {a,c,d,e,h}        {c}

Я прочитал abt np.intersect1d, set.intersection, поэтому могу сделать пересечение нескольких наборов. Но я не знаю, как это сделать с умом. Может кто-нибудь помочь мне с этой проблемой?

0
Joe 23 Ноя 2021 в 17:36
Похоже, вы даже не пытались сделать это каким-либо способом.
 – 
Scott Hunter
23 Ноя 2021 в 17:38

1 ответ

Лучший ответ

Вы можете itertools.accumulate для этой задачи следующим образом

import itertools
letters = [{"a","b","c","d","e"},{"b","c","d","e","f"},{"b","c","d","f","g"},{"a","b","c","f","g"},{"a","c","d","e","h"}]
intersections = list(itertools.accumulate(letters, set.intersection))
print(intersections)

Выход

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

Обратите внимание, что первым элементом является {'e', 'a', 'b', 'c', 'd'}, а не None, поэтому вам потребуется изменить intersections в этом отношении.

1
Daweo 23 Ноя 2021 в 17:41
Отличное решение! Вы знаете, как я могу реализовать это в фреймворке данных?
 – 
Joe
23 Ноя 2021 в 18:21