选择名称与regex匹配的列

时间:2014-05-25 00:43:48

标签: regex pandas filter

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

例如,

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列的新数据框,以及包含字符串“date”的所有列。我无法在df.columns上使用str.contains。似乎过滤器功能有效,但我想创建逻辑索引,如果这是一个有效的方法。感谢。

3 个答案:

答案 0 :(得分:1)

这是你想做的吗?

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

答案 1 :(得分:0)

如果将列Index对象转换为系列,则可以使用.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

(就我个人而言,我认为Index对象应该增长.str,基本上是.to_series().str,以使其更加清晰。)

答案 2 :(得分:0)

您可以将 '^id$|date' 正则表达式与 df.filter()

一起使用
In [28]: df.filter(regex='^id$|date')
Out[28]: 
  id  0_date 1_date
1  a  21-Jan  2-Mar