Как мне отфильтровать столбец данных с помощью регулярных выражений? - PullRequest
1 голос
/ 31 октября 2019

Вот мое регулярное выражение date_regex='\d{1,2}\/\d{1,2}\/\d{4}$'

dates_as_first_row Dataframe

Вот мой date_as_first_row Dataframe

Я пытаюсь отфильтровать датустолбец, но получить пустой (377,0) Dataframe. date_column=dates_as_first_row.filter(regex=attempt,axis='columns')

1 Ответ

0 голосов
/ 31 октября 2019

Вы можете сделать это, используя .str.match.

Если ваш столбец называется '0', он выглядит следующим образом:

indexer=df['0'].str.match('\d{1,2}\/\d{1,2}\/\d{4}$')
df[indexer]

Если вы хотите выбрать все строки, которые содержатшаблон в любом из строковых столбцов, вы можете сделать:

#          v- select takes all object columns     
#                             v- apply the lambda expression to each of the selected object columns with True if the row contains the pattern in the specific column
#                                                                                                        v- if any of the column vectors contains True, return True, otherwise False (the column vectors contain the result of str.match which is a boolean)
indexer=df.select_dtypes('O').apply(lambda ser: ser.str.match('\d{1,2}\/\d{1,2}\/\d{4}$'), axis='index').any(axis='columns')
df[indexer]

Но обратите внимание, что это работает, только если все ваши столбцы object на самом деле хранят строки. Что обычно имеет место, если вы позволяете пандам определять типы столбцов при создании кадра данных. Если это не так, вам нужно добавить проверку типа, чтобы избежать ошибки времени выполнения:

import re

def filter_dates(ser):
    date_re= re.compile('\d{1,2}\/\d{1,2}\/\d{4}$')
    return ser.map(lambda val: type(val) == str and bool(date_re.match(val)))

df.select_dtypes('O').apply(filter_dates, axis='index').any(axis='columns')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...