Сравните 2 столбца списка в фрейме данных pandas. Удалить значение из одного списка, если оно присутствует в другом

Скажем, у меня есть 2 столбца списка, как показано ниже:

group1 = [['John', 'Mark'], ['Ben', 'Johnny'], ['Sarah', 'Daniel']]
group2 = [['Aya', 'Boa'], ['Mab', 'Johnny'], ['Sarah', 'Peter']]

df = pd.DataFrame({'group1':group1, 'group2':group2})

Я хочу сравнить два столбца списка и удалить элементы списка из group1, если они присутствуют в group2. Итак, ожидаемые результаты для вышеуказанного:

    group1                       group2
['John', 'Mark']             ['Aya', 'Boa']
['Ben']                     ['Mab', 'Johnny']
['Daniel']                  ['Sarah', 'Peter']

Как я могу это сделать? Я пробовал это:

df['group1'] = [[name for name in df['group1'] if name not in df['group2']]]

Но получил ошибку:

TypeError: unhashable type: 'list'

Пожалуйста помоги.

Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
3
0
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно застегнуть две серии. Я использую набор здесь для эффективности (это не критично, если у вас всего несколько элементов в списке):

df['group1'] = [[x for x in a if x not in S]
                for a, S in zip(df['group1'], df['group2'].apply(set))]

Вывод:

         group1          group2
0  [John, Mark]      [Aya, Boa]
1         [Ben]   [Mab, Johnny]
2      [Daniel]  [Sarah, Peter]

Вы можете использовать цикл в лямбда-функции:

df['group1']=df[['group1','group2']].apply(lambda x: [i for i in x['group1'] if i not in x['group2']],axis=1)
print(df)
'''
         group1          group2
0  [John, Mark]      [Aya, Boa]
1         [Ben]   [Mab, Johnny]
2      [Daniel]  [Sarah, Peter]
'''

Обратите внимание, что это менее эффективно, чем использование понимания списка и набора;)

mozway 18.11.2022 08:58

Ты прав. Думаю, мне нужно больше работать над эффективностью. Спасибо.

Bushmaster 18.11.2022 09:08

Вы можете использовать установленную разницу:

df.apply(lambda x: set(x['group1']).difference(x['group2']), axis=1)

Вывод:

0    {John, Mark}
1           {Ben}
2        {Daniel}
dtype: object

Чтобы получить списки, вы можете добавить .apply(list) в конце.

Другие вопросы по теме

Как элегантно переименовать выходные данные Pandas?
Как изменить цвет точек данных на точечной диаграмме в соответствии с возрастным диапазоном?
Изменить порядок значений в фрейме данных на основе условия в Pandas
Np.where изменить значение в столбце, если другое значение столбца находится в другом столбце фрейма данных
Отслеживание претензий с использованием столбцов даты/времени и создание окончательного подсчета с помощью панд
Заменить вложенные циклы for в сочетании с условиями для повышения производительности
NotImplementedError: создание глубокой копии выражения CVXPY не поддерживается. Вместо этого используйте .copy()
Выбор столбцов на основе символов в именах столбцов
Минимизация строк с помощью слияния/сквоша в Pandas DataFrame с несколькими индексами
TypeError: индексы списка должны быть целыми числами или срезами, а не str - работа с фреймами данных