Настройка
df = pd.DataFrame(dict(
A=['I need avocado', 'something', 'useless', 'nothing'],
B=['something', 'I eat margarina', 'eat apple', 'more nothing']
))
includeKeywords = ["apple", "avocado", "bannana"]
Проблема
A B
0 I need avocado something # True 'avocado' in A
1 something I eat margarina
2 useless eat apple # True 'apple' in B
3 nothing more nothing
Решение
df[df.stack().str.contains('|'.join(includeKeywords)).any(level=0)]
A B
0 I need avocado something
2 useless eat apple
Подробнее
Это создает строку поиска regex
. В regex
, '|'
означает or
. Таким образом, для поиска regex
это означает, что соответствует 'apple'
, 'avocado'
или 'bannana'
kwstr = '|'.join(includeKeywords)
print(kwstr)
apple|avocado|bannana
Укладка сгладит нашу DataFrame
df.stack()
0 A I need avocado
B something
1 A something
B I eat margarina
2 A useless
B eat apple
3 A nothing
B more nothing
dtype: object
К счастью, метод pandas.Series.str.contains
может обрабатывать regex
, и он будет выдавать логическое значение Series
df.stack().str.contains(kwstr)
0 A True
B False
1 A False
B False
2 A False
B True
3 A False
B False
dtype: bool
В этот момент мы можем хитро использовать pandas.Series.any
, предлагая заботиться только о level=0
mask = df.stack().str.contains(kwstr).any(level=0)
mask
0 True
1 False
2 True
3 False
dtype: bool
Используя level=0
, мы сохранили исходный индекс в результирующем Series
. Это делает его идеальным для фильтрации df
df[mask]
A B
0 I need avocado something
2 useless eat apple