Поиск строки во всех столбцах Pandas DataFrame и фильтрах

Думал, что это будет прямолинейно, но у него возникли проблемы с поиском элегантного способа поиска всех столбцов в фреймворке данных в то же время для частичного совпадения строк. В основном, как бы применить df['col1'].str.contains('^') к целому фрейму данных сразу и отфильтровать до любых строк, содержащих записи, содержащие совпадение?

Ответ 1

Метод Series.str.contains ожидает шаблон регулярного выражения (по умолчанию), а не литеральную строку. Поэтому str.contains("^") соответствует началу любой строки. Поскольку каждая строка имеет начало, все соответствует. Вместо этого используйте str.contains("\^") для соответствия буквенному символу ^.

Чтобы проверить каждый столбец, вы можете использовать for col in df для итерации по именам столбцов, а затем вызвать str.contains для каждого столбца:

mask = np.column_stack([df[col].str.contains(r"\^", na=False) for col in df])
df.loc[mask.any(axis=1)]

В качестве альтернативы вы можете передать regex=False в str.contains, чтобы тест использовал оператор Python in; но (в общем) с использованием регулярного выражения быстрее.

Ответ 2

Попробуйте:

df.apply(lambda row: row.astype(str).str.contains('TEST').any(), axis=1)

Ответ 3

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

у меня был Dataframe (360 000 строк), необходимый для поиска по всему фрейму данных, чтобы найти строки (всего несколько), которые содержали слово "TOTAL" (любой вариант, например "TOTAL PRICE", "TOTAL STEMS" и т.д.), и удалить их строк.

я наконец обработал фрейм данных в два этапа:

НАЙДИТЕ КОЛОННЫ, КОТОРЫЕ СОДЕРЖИТ СЛОВО:

for i in df.columns:
df[i].astype('str').apply(lambda x: print(df[i].name) if x.startswith('TOTAL') else 'pass')

УДАЛИТЬ СТРОКИ:

df[df['LENGTH/ CMS'].str.contains('TOTAL') != True]