2014-05-25 156 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