Есть ли возможность фильтровать панд по списку?

У меня есть df со столбцами product_id и keyword. Я повторяю идентификатор продукта для group_name, group in s.groupby('product_id'), и на этом этапе я хочу сохранить группы, содержащие все элементы из списка поиска. Например: enter image description here

и мой список поиска = ['land', 'cruiser']

поэтому на выходе я хочу это:

enter image description here

я пробовал это

data[data["keywords"].isin(search_words)]

но этот метод сохраняет все группы, если он содержит хотя бы один элемент из списка, в то время как I группы должны содержать все элементы в списке поиска.

Не могли бы вы включить свои данные в виде текста, чтобы мы могли их использовать?

enke 09.04.2022 18:52

Если у вас есть приведенные ниже данные, хотите ли вы, чтобы группа 1 включала «сарай»? df = pd.DataFrame({"product_id": [1,1, 2, 3, 1, 2, 3], "keywords": ["land", "barn", "land", "land", "cruiser", "barn", "cruiser"]})

Levin Magruder 09.04.2022 20:46
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Для другого ответа (в одну строку!):

import pandas as pd
s = pd.DataFrame({'product_id': [1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4],
                  'keywords': ["land", "cruiser", "land", "cruiser", "land",
                               "land", "land", "cruiser", "cruiser", "land", "cruiser"]})

search_words = ['land', 'cruiser']

s[[(all(p in x for p in search_words)) \
   for x in s.merge(s.groupby("product_id").apply(
           lambda x: list(set(x["keywords"]))).to_frame(). \
               rename(columns={0: "grouped"}), left_on="product_id",
               right_index=True)["grouped"]]]
#Out: 
#    product_id keywords
#0            1     land
#1            1  cruiser
#2            1     land
#3            1  cruiser
#4            1     land
#9            4     land
#10           4  cruiser

РЕДАКТИРОВАТЬ

Я только что использовал pandas групповая фильтрация и понял, что было бы гораздо проще использовать это здесь. Возвращенный фрейм данных точно такой же, как и выше, но использует намного меньше кода!

s.groupby("product_id").filter(lambda x: all(p in list(set(x["keywords"])) for p in search_words))

Основная логика здесь взята из Ответ С. Роусона.

Вместо одной строки я создаю несколько вспомогательных переменных — я создаю ряд product_id и все связанные с ними условия поиска (product_keywords). Затем я делаю серию (хранителей) всех product_id, у которых есть все ключевые слова. Наконец, я использую метод isin(), чтобы проверить, есть ли в строках данных product_id в этом списке.

Это сохраняет все термины, которые находятся в группах, содержащих все искомые термины; поэтому, если в группе 1 есть «земля» и «крейсер», а также другие слова, это получает все термины.

df = pd.DataFrame({"product_id": [1,1, 2, 3, 1, 2, 3],
                   "keywords": ["land", "barn", "land", "land", "cruiser", "barn", "cruiser"]})

search_list = set(['land', 'cruiser'])

product_keywords = df.groupby("product_id").apply(lambda x: list(set(x["keywords"])))

product_keywords
# product_id
# 1    [barn, cruiser, land]
# 2             [barn, land]
# 3          [cruiser, land]

keepers = product_keywords[product_keywords.apply(lambda found_terms: all(search_term in found_terms for search_term in search_list))]

keepers
# product_id
# 1    [barn, cruiser, land]
# 3          [cruiser, land]


df.loc[df['product_id'].isin(keepers.index)]  
#    product_id keywords
# 0           1     land
# 1           1     barn
# 3           3     land
# 4           1  cruiser
# 6           3  cruiser

Конечно, легче следить за кодом, разбитым на части!

S Rawson 09.04.2022 21:49

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

S Rawson 09.04.2022 22:27

С. Роусон. Нет, я не знал, что вы можете фильтровать объект DataFrameGroupBy, спасибо. Интересно, «опускает» ли он фильтр и вообще избегает включения строк в группы. dir(df.groupby('product_id')) также показывает много других атрибутов для изучения.

Levin Magruder 10.04.2022 00:18

Ух ты! Это полезный кусок кода, спасибо!

S Rawson 10.04.2022 15:44

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