Панды: фильтровать данные из одного столбца данных и обновлять другой столбец df - PullRequest
0 голосов
/ 09 июля 2019

У меня одна ситуация в пандах. У меня есть файл Excel, имеющий столбец с именем item, в нем есть текст. У меня есть другой фрейм данных, имеющий столбец с именем brand. Я хотел добавить название бренда перед столбцом товара, если в тексте столбца товара есть строка бренда.

Вот мой снимок файла Excel.

enter image description here

Мой бренд данных выглядит так, как показано ниже.

brand_df =  pd.DataFrame({'brand':['spark','hadoop','hive']})

Я хотел проверить, существует ли марка brand_df в item_df или нет. Если бренд существует, то он должен находиться под именем update_column перед пунктом, как показано ниже. enter image description here

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

 self.item_df['updated_column'] = self.item_df["item"].map(lambda x : 'spark' if 'spark' in x else 'hive' if 'hive' in x else 'hadoop' if 'hadoop' in x else '' )

В приведенной выше команде проблема в том, что будет очень трудно работать, если у вас длинный список брендов.

Может кто-нибудь предложить мне лучший способ решения этой проблемы.

Текстовая версия содержимого Excel

item
hadoop is fast
hive is sql on hdfs
spark is superfast
spark is awesome
AWS is emr function 

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Почему не pd.Series.str.findall и str.join:

df['update_column'] = df['item'].str.findall('|'.join(brand_df['brand'])).str[0]
0 голосов
/ 09 июля 2019

Используйте границы слов с Series.str.extract для получения первого соответствующего значения:

pat = '|'.join(r"\b{}\b".format(x) for x in brand_df['item'])

#if dont need words boundaries
#pat = '|'.join(brand_df['item'])
item_df['updated_column'] = item_df['item'].str.extract('('+ pat + ')', expand=False)

Или, если необходимо, все соответствующие значения используйте Series.str.findall с Series.str.join:

item_df['updated_column'] = item_df['item'].str.findall(pat).str.join(',')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...