Боюсь, что решение очевидно или вопрос дубликат, но я пока не смог найти ответ: у меня есть фрейм данных pandas, который содержит длинные строки, и мне нужно сопоставить две строки одновременно. Я нашел версию "или" несколько раз, но пока не нашел решения "и".

Пожалуйста, предположим, что следующий фрейм данных, где интересная информация "тип элемента" и тип части "разделены случайным образом между элементами:

import pandas as pd
data = pd.DataFrame({"col1":["element1_random_string_subpartA"
                           , "element2_ran_str_subpartA"
                           , "element1_some_text_subpartB"
                           , "element2_some_other_text_subpartB"]})

Теперь я хотел бы отфильтровать все строки, которые содержат element1 и subpartA.

data.col1.str.contains("element1|subpartA")

Вернуть фрейм данных

True 
True
True
False

Что является ожидаемым результатом. Но мне нужна комбинация "И" и

data.col1.str.contains("element1&subpartA")

Возвращается

False
False
False
False

Хотя я бы ожидал

True
False 
False
False
1
MichaelA 28 Окт 2019 в 12:50

1 ответ

Лучший ответ

Regex and - это непросто:

m = data.col1.str.contains(r'(?=.*subpartA)(?=.*element1)')  

Проще объединить оба условия с & для побитового AND:

m = data.col1.str.contains("subpartA") & data.col1.str.contains("element1")
print (m)
0     True
1    False
2    False
3    False
Name: col1, dtype: bool
1
jezrael 28 Окт 2019 в 09:55