2016-12-20 8 views
2

データフレームdfがあり、その名前は単語または日付のいずれかです。私は名前の列、または特定の日付の列だけを保持したい。特に、データフレームには「Price」、「Origin」、「Company」という列があり、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

1つの選択肢は、リストの内包表記を使用して、その場で新しいリストを作成するには、次のようになります。

isdigitはどんな「COLが整数である」エラーを回避して前に

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'] 

は、文字列にタイプを変更します

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) 
関連する問題