2014-05-25 91 views
0

如何使用逻辑索引(或任何其他有效的方法)选择列名称与正则表达式具有一定匹配的列。选择具有逻辑索引的列

例如,

raw = ''' id 0_date 0_hr 1_date 1_hr 
1 a 21-Jan  30 2-Mar  75 
''' 

import pandas as pd 
from StringIO import StringIO 
df = pd.read_table(StringIO(raw),header=0,index_col=[0],sep="\s+") 

我想创建一个新的数据框,只有ID列并包含字符串“日期”的所有列。我无法在df.columns上使用str.contains。看起来过滤器功能起作用,但我想创建逻辑索引,如果这是一个有效的方法。谢谢。

回答

0

如果转换列索引对象的系列,你可以使用.str进行量化的字符串操作(如正则表达式搜索):

>>> df.columns 
Index([u'id', u'0_date', u'0_hr', u'1_date', u'1_hr'], dtype='objec 
>>> df.columns.to_series().str 
<pandas.core.strings.StringMethods object at 0xa2b56cc> 
>>> df.columns.to_series().str.contains("date") 
id  False 
0_date  True 
0_hr  False 
1_date  True 
1_hr  False 
dtype: bool 
>>> df.loc[:, df.columns.to_series().str.contains("date")] 
    0_date 1_date 
1 21-Jan 2-Mar 

在这种情况下,我可能会使用endswith

>>> df.loc[:, df.columns.to_series().str.endswith("date")] 
    0_date 1_date 
1 21-Jan 2-Mar 

(我个人认为,指数对象应该长出.str这基本上是.to_series().str,使这一点清洁剂。)

+0

太好了。所以这直接回答我的问题。为了发展我的理解,这个策略是在pandas/python中使用的一个很好的策略,还是你为这个任务采用了不同的策略? – julieth

+0

@julieth:这是一个非常适合的习惯用法。但不要折扣listcomp方法 - 它们也常常有用。 – DSM

1

这是你想要做的吗?

selected_columns = ['id'] + [e for e in df.columns if 'date' in e] 
new_df = df[selected_columns] 
+0

就是这样。谢谢。在R中,我们可以编写诸如grepl(“date”,colnames(df))之类的东西,它会创建一个逻辑索引,通过它我们可以将子集合。也许这同样的逻辑不适用于这里,虽然我看到人们这样做选择行。 – julieth