Поиск списка строк в столбце данных - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть столбец данных, который выглядит следующим образом:

import pandas as pd
import numpy as np

   Items
0  Product A + Product B + Product C   
1  Product A + Product B + Product B1 + Product C1 
2  

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

My_Items = ['Product B', 'Product C', 'Product C1']

Я пробовал следующую лямбда-функцию, но она не собирает строки, которые я ищу, если в столбце более 1 товара :

df['My Items'] = df['Items'].apply(lambda x: 'Contains my items' if x in My_Items else '')

Кто-нибудь знает, как можно искать несколько строк в списке в лямбда-функции?

Спасибо за любую помощь или предложения.

С уважением

Ответы [ 3 ]

3 голосов
/ 24 апреля 2020

Используйте Series.str.count для подсчитанных значений и затем протестируйте с помощью Series.gt для большего как 1:

mask = df.Items.str.count('|'.join(My_Items)).gt(1)

df['My Items'] = np.where(mask,'Contains 2 or more items', '')
print (df)
                                             Items                  My Items
0                Product A + Product B + Product C  Contains 2 or more items
1  Product A + Product B + Product B1 + Product C1  Contains 2 or more items

Подробности :

print (df.Items.str.count('|'.join(My_Items)))
0    2
1    3
Name: Items, dtype: int64
2 голосов
/ 24 апреля 2020

IIU C вы можете использовать str.findall и проверить, что мы получаем не менее 2 совпадений:

import numpy as np

m = df.Items.str.findall('|'.join(My_Items)).str.len().ge(2)
df['My items'] = np.where(m, 'Contains at least 2 items', '')

Если мы проверим дополнительную строку, содержащую только 1 продуктов:

print(df)

                        Items  \
0                Product A + Product B + Product C      
1  Product A + Product B + Product B1 + Product C1     
2                            Product A + Product D    

                    My items  
0  Contains at least 2 items  
1  Contains at least 2 items  
2                             

Где df.Items.str.findall('|'.join(My_Items)) предоставляет вам список всех найденных совпадений:

df.Items.str.findall('|'.join(My_Items))

 [Product B, Product C]
1    [Product B, Product B, Product C]
2                                   []
Name: Items, dtype: object
0 голосов
/ 24 апреля 2020

Спасибо, ребята! Решение, которое я искал, оказалось комбинацией обоих ваших ответов!

В итоге я сделал это для маски, поэтому я мог отфильтровать:

DF['My_Items'] = DF.Items.str.findall('|'.join(My_list)).str.len().gt(1)

Затем это для списка предметов, так что теперь я могу анализировать комбинации:

DF['My_Items'] = DF.Items.str.findall('|'.join(My_list)).astype(str)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...