У меня есть фрейм данных с именами столбцов, такими как v1,...,v99, tm1,...tm99
и так далее. Однако не для каждого числа существует столбец (mybe v42 отсутствует). Буквы могут варьироваться от a до 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
. Я подумал о методе Lambda-Apply, который применяет функцию регулярного выражения, но не смог заставить это работать. Я просто понятия не имею, как это сделать сейчас, и мне нужна помощь. я
df[ [col for col in df.columns if ('v' in col or 'tm' in col or 'zz' in col)] ]
должен возвращать только столбцы, содержащие эти буквы.
Решение Виктора работает для меня. Большое спасибо! Пожалуйста, напишите решение, чтобы я мог его подтвердить.
Вы можете использовать шаблон на основе чередования, просто оберните альтернативы незахватывающей группой
persDf = df.filter(regex=('^(?:{})[0-9]+$'.format('|'.join(args))))
Это создаст регулярное выражение, подобное ^(?:v|tm|zz)[0-9]+$
, что означает:
^
- начало строки(?:v|tm|zz)
- любая из альтернатив: v
, илиtm
, илиzz
[0-9]+
- 1+ цифры$
- конец строки.
Попробуйте
'^(?:{})[0-9]+$'.format('|'.join(args))
вместо'^' + args + r'[0-9]+$'