2016-12-20 38 views
2

我有一個數據框df,其中的名稱是單詞或日期的列。我只想保留名稱中包含單詞的列或某些特定日期。特別是,數據框有「價格」,「起源」,「公司」等欄目,並且與1980年到2008年一樣,我只想保留1996年到2008年的數據,名。保留名稱爲整數且滿足特定條件的數據框的列

這是我寫的代碼,但我敢肯定有一個更短,更優雅的方式來做到這一點:

columns_to_keep = list()  
for c in df.columns.values: 
    if c.isdigit(): 
     if int(c) > 1995: 
      columns_to_keep.append(c) 
    else: 
     columns_to_keep.append(c) 
df_copy = df[columns_to_keep] 

任何幫助嗎?謝謝!

+0

爲什麼不是你可以查詢和過濾的行內的年份數據? –

回答

2

一種選擇是使用列表中理解和即時創建一個新的列表:

df.columns 
Index(['Price', 'Origin', 'Company', '1980', '1981', '1982', '1983', '1984', 
     '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', 
     '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2001', '2002', 
     '2003', '2004', '2005', '2006', '2007', '2008'], 
     dtype='object') 

columns_to_keep = [col for col in df.columns if not (col.isdigit() and int(col) <= 1995)] 

['Price', 
'Origin', 
'Company', 
'1996', 
'1997', 
'1998', 
'1999', 
'2000', 
'2001', 
'2002', 
'2003', 
'2004', 
'2005', 
'2006', 
'2007', 
'2008'] 

更改類型爲字符串的isdigit得到周圍任何「山坳是一個整數」錯誤之前:

columns_to_keep = [col for col in df.columns if not (str(col).isdigit() and int(col) <= 1995)] 
+0

您的列表理解引發錯誤。 col是一個整數並且沒有isdigit方法。 –

+0

@TedPetrou很可能是因爲你的列名是整數,從OP的代碼看來,他/她似乎有字符串列名。 – Psidom

+0

是的,所有的列名都是字符串 – gtroupis

0

您可以使用DataFrame.filter。該方法也支持正則表達式,所以你有權匹配任何你喜歡的模式。

import pandas as pd 
import re 
df = pd.DataFrame({'Price':[1,2,3], 'Origin':['Earth','Mars','Pluto'], 'Company':['SpaceX', 'SpaceY', 'SpaceZ'], '1980':[100,101,102], '2000':[50,51,52]}) 

years = ['%d'%x for x in range(1996,2009)] 
pattern = r'(?:[a-zA-Z]+|'+'|'.join(y)+')' 
newdf = df.filter(regex=pattern)