str.contains
возвращает маску:
df['a1'].str.contains('aa',case = False)
1 True
2 False
Name: a1, dtype: bool
Однако drop
принимает индексные метки, а не логические маски. Если вы откроете справку по drop
, вы можете наблюдать это из первых рук:
?df.drop
Signature: df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
Docstring:
Return new object with labels in requested axis removed.
Parameters
----------
labels : single label or list-like
Index or column labels to drop.
Вы можете определить индексные метки из маски и передать эти для отбрасывания
idx = df.index[df['a1'].str.contains('aa')]
df.drop(idx)
a1 b1 c1
2 ab ba ca
Однако, это слишком ветрено, поэтому я бы рекомендовал просто придерживаться пандейского метода отбрасывания строк на основе условий, логическое индексирование :
df[~df['a1'].str.contains('aa')]
a1 b1 c1
2 ab ba ca
Если кто-то заинтересован в удалении строк, содержащих строки в списке
df = df[~df['a1'].str.contains('|'.join(my_list))]
Обязательно уберите пробелы. Кредит https://stackoverflow.com/a/45681254/9500464