我必须选择以给定字母(变量称为sLetter
)开头的列,该字母之后必须是数字。如果sLetter是v
而不是v1, v399
,依此类推。 ve1
和v100e
一样无效。
我开始和regular expressions
一起玩,以解决问题,
df.filter(regex=(sLetter + ".[1-9]"))
我发现了类似的问题here,在答案中我发现了与使用lambda expression
相比该方法的速度分析,这表明后者要快得多。不幸的是,我无法提出解决我的问题的lamdba表达式。我可以使用
sLetter
的选择
df.columns.map(lambda x: x.startswith(sLetter))
但是到此结束。有谁能帮助我创建比我现有解决方案更快的解决方案?
答案 0 :(得分:0)
我们可以使用regex
并指定该列必须以^sLetter
开头,并且数字量必须为3,并且必须以这些数字$
结尾。
# Make example dataframe
df = pd.DataFrame({'v874':[1,2,3],
'v100e':[4,5,6],
've1':[7,8,9],
'v399':[10,11,12]})
df
v874 v100e ve1 v399
0 1 4 7 10
1 2 5 8 11
2 3 6 9 12
sLetter = 'v'
df.filter(regex= '^' + sLetter + r'[0-9]{3}$')
v874 v399
0 1 10
1 2 11
2 3 12
答案 1 :(得分:0)
我认为您也可以使用str
+ contains
方法。要进行过滤,您可以使用:
df.loc[:, df.columns.str.contains('^v+[0-9]')]
您可以像这样使用map
(对表达式取反以获取正确的结果):
import re
df.loc[:, df.columns.map(lambda x: not re.match('^(?!v+[0-9])', x))]