Python 在Regex上循环以按多个名称-值组合提取列
我有一个数据框,它的列名是Python 在Regex上循环以按多个名称-值组合提取列,python,regex,pandas,Python,Regex,Pandas,我有一个数据框,它的列名是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\u re
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\u required\u数据集('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
但这不起作用,即使我将
元组
转换为列表
。显然,由于regex
只接受一个字符串
。我考虑了一个Lambda Apply方法,该方法应用regex函数,但无法使其也起作用。我只是不知道如何做到这一点,现在需要一些帮助。I您可以使用基于替代的模式,只需使用非捕获组包装替代
persDf = df.filter(regex=('^(?:{})[0-9]+$'.format('|'.join(args))))
这将创建一个类似正则表达式的^(?:v | tm | zz)[0-9]+$
,这意味着:
-字符串的开头^
-任何备选方案:(?:v | tm | zz)
,或v
,或tm
zz
-1+位[0-9]+
-字符串结束$
尝试
'^(?:{})[0-9]+$'.format('.|'.join(args))
而不是'^'+args+r'[0-9]+$'
df[[col for col in df.columns if('v'in col或'tm'in col或'zz'in col)]应该只返回包含这些字母的列。Wiktors解决方案适合我。非常感谢你!请写一份解决方案,以便我确认。