如何使用逻辑索引(或任何其他有效方法)来选择列名称包含与正则表达式特定匹配的列。
例如,
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。似乎过滤器功能有效,但我想创建逻辑索引,如果这是一个有效的方法。感谢。
答案 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