Цикл над регулярным выражением для извлечения столбцов по нескольким комбинациям имя-значение - PullRequest
1 голос
/ 29 мая 2019

У меня есть фрейм данных с именами столбцов, такими как v1,...,v99, tm1,...tm99 и так далее. Хотя не для каждого числа существует столбец (mybe v42 отсутствует). Буквы могут варьироваться от до zzz. Я написал метод фильтрации моих столбцов по буквенной комбинации (например, 'v' или 'tm'), за которой следует цифра. Это выглядит как

def create_required_dataset(df, var_filter):
    persDf = df.filter(regex=('^' + var_filter + r'[0-9]+$'))
    return persDf

Это работает create_required_dataset('v'), и я получаю фрейм данных со всеми столбцами, начинающимися с v, за которыми следует число.

и отлично работает. Но теперь мне нужно доставить не только одну комбинацию букв ( 'tm', 'zzz' ), но и столько, сколько вводит пользователь.

Таким образом, запрос должен выглядеть следующим образом:

create_required_dataset('v', 'tm', 'zz')

Я пытался работать с *args, поэтому я переписал свой метод на

def create_required_dataset(df, *args):
    persDf = df.filter(regex=('^' + args + r'[0-9]+$'))
    return persD

Но это не работает, даже если я преобразую tuple в list. Очевидно, что regex занимает только один string. Я подумал о методе лямбда-аппликации, который применяет функцию регулярного выражения, но не смог заставить это работать. Я просто не знаю, как это сделать сейчас, и мне нужна помощь. I

1 Ответ

1 голос
/ 29 мая 2019

Вы можете использовать шаблон на основе чередования, просто оберните альтернативы группой без захвата

persDf = df.filter(regex=('^(?:{})[0-9]+$'.format('|'.join(args))))

Это создаст регулярное выражение типа ^(?:v|tm|zz)[0-9]+$, что означает:

  • ^ - начало строки
  • (?:v|tm|zz) - любая из альтернатив: v, или tm, или zz
  • [0-9]+ - 1+ цифр
  • $ - конец строки.

См. regex demo и его график :

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...