Думал, что это будет прямолинейно, но у него возникли проблемы с поиском элегантного способа поиска всех столбцов в фреймворке данных в то же время для частичного совпадения строк. В основном, как бы применить df['col1'].str.contains('^')
к целому фрейму данных сразу и отфильтровать до любых строк, содержащих записи, содержащие совпадение?
Поиск строки во всех столбцах Pandas DataFrame и фильтрах
Ответ 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]