我有一个数据框,其列名类似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
。我想到了一个应用regex函数的Lambda-Apply方法,但无法使其正常工作。我只是不知道如何立即完成此工作,需要一些帮助。我
答案 0 :(得分:1)
您可以使用基于交替的模式,只需将其他选项包裹在一个非捕获组中
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和its graph: