如何为使用熊猫设置列选择设置有效的开始和结束条件

时间:2019-05-11 11:18:49

标签: python pandas

我必须选择以给定字母(变量称为sLetter)开头的列,该字母之后必须是数字。如果sLetter是v而不是v1, v399,依此类推。 ve1v100e一样无效。

我开始和regular expressions一起玩,以解决问题,

df.filter(regex=(sLetter + ".[1-9]"))

我发现了类似的问题here,在答案中我发现了与使用lambda expression相比该方法的速度分析,这表明后者要快得多。不幸的是,我无法提出解决我的问题的lamdba表达式。我可以使用

来完成sLetter的选择
df.columns.map(lambda x: x.startswith(sLetter))

但是到此结束。有谁能帮助我创建比我现有解决方案更快的解决方案?

2 个答案:

答案 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))]