2014-05-25 5 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 컬럼과 문자열 "날짜"를 포함하는 모든 열이있는 새로운 dataframe를 작성하고 싶습니다. 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 

는 (개인적으로는 인덱스 오브젝트는, 기본적으로 .to_series().str.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