Найти общие элементы между двумя списками столбцов списка?

#python #pandas #list #dataframe #lambda

#python #pandas #Список #фрейм данных #лямбда

Вопрос:

Давайте предположим, что это фрейм данных, который у меня есть:

 dw = {'id' : [1,2,3,4,5], 'first_item' : [['Motherboard', 'Miscellaneous'],
                                        ['Miscellaneous', 'Mechanical Hardware'],
                                        ['Motherboard', 'Hard Drive'],
                                        ['Mechanical Hardware', 'Hard Drive'],
                                        ['Motherboard','Mechanical Hardware']],
      'second_item' : [['Motherboard', 'Hard Drive'],
                                        ['Mechanical Hardware', 'Mechanical Hardware'],
                                        ['Motherboard', 'Hard Drive'],
                                        ['Mechanical Hardware', 'Hard Drive'],
                                        ['Motherboard','Miscellaneous']]}
dw = pd.DataFrame(dw)
  

Я хочу найти пересечения / общие элементы между первым элементом и вторым элементом (по строкам), получить такой результат:

    dw['new']
1 ['Motherboard']
2 ['Mechanical Hardware']
3 ['Motherboard', 'Hard Drive']
4 ['Mechanical Hardware', 'Hard Drive']
5 ['Motherboard']
  

я пробовал приведенный ниже код, но он не дает желаемых результатов:

 def intersection(lst1, lst2):
    return list(set(lst1) amp; set(lst2))

dw['new'] = dw.apply(lambda x: intersection(dw.first_item, dw.second_item), axis = 1)
  

Комментарии:

1. ДА. Это была ошибка (опечатка). Спасибо за выделение. Но я получаю сообщение об ошибке: unhashable type: ‘список’.

2. ДА. Теперь это сработало. Я понял, в чем была ошибка. Большое вам спасибо. Не могли бы вы помочь мне также найти необычные элементы? т. Е. Исключить общие элементы / пересечения и найти элементы, которые не являются общими для первого и второго элемента?

3. Вы ищете симметричную разницу. Попробуйте что-то вроде list(set(lst1) ^ set(lst2)) ?

Ответ №1:

Вы можете попробовать np.intesect1d :

 dw['new'] = [np.intersect1d(x,y) for x,y in zip(dw.first_item, dw.second_item)]
  

Комментарии:

1. еще один запрос: если я хочу найти необычные элементы (те элементы, которых нет в first_item amp; second_item (необычные элементы), то каким будет код:

2. Используйте np.setxor1d вместо np.intersect1d , чтобы найти set exclusive.

Ответ №2:

Попробуйте это

 list1_as_set = set(list1)
intersection = list1_as_set.intersection(list2)             
intersection_as_list = list(intersection)
  

Я не уверен, но попробуйте это!!

Комментарии:

1. его вопрос касается двух списков в каждой строке в фрейме данных pandas — это только для двух наборов.