2016-05-21 5 views
2

私は非常に大きなデータフレームで何年かをフィルタリングしようとしています。あなたは別のシンボルが私のデータセット内の異なる開始年持って見ることができるように大きなパンダのデータフレームでデータをフィルタリングします

Year Value Symbol 
2001 0.1  ABC 
2002 0.1  ABC 
2003 0.2  ABC 
2002 0.4  ZZZ 
2003 0.8  ZZZ 
2000 0.9  ASD 
2001 0.1  ASD 
2002 0.3  ASD 
2003 0.2  ASD 


これが私のデータの非常に短いと簡単にバージョンです。たとえば、シンボルASDは2000年に最初の値を持ち、シンボルZZZは2002年にしかありません。この具体的な点では、すべてのシンボルがその価値を持つ年の間データを保存したいだけです。結果は次のようになります。

Year Value Symbol 
2002 0.1  ABC 
2003 0.2  ABC 
2002 0.4  ZZZ 
2003 0.8  ZZZ 
2002 0.3  ASD 
2003 0.2  ASD 

私の大きなデータフレームの問題は、私は日付がたくさんあると私はすべてのシンボルの開始日を知らない(と私はシンボルの多くを持っている)ということです。だから私は最初に各シンボル(または後者の開始日のシンボル)の開始日を見つけ、それ以降はすべての不要なデータを削除する必要があります。 pandas/pythonでこれを効率的に行う方法はありますか?

答えて

4

あなたはpivot、その後、dropnaunstackを使用することができます。

df = df.pivot(index='Year', columns='Symbol', values='Value') 
     .dropna() 
     .unstack() 
     .reset_index(name='Value') 

print (df) 
    Symbol Year Value 
0 ABC 2002 0.1 
1 ABC 2003 0.2 
2 ASD 2002 0.3 
3 ASD 2003 0.2 
4 ZZZ 2002 0.4 
5 ZZZ 2003 0.8 
2

あなたはより多くの有益なパフォーマンスの提案を得るためにあなたの現在のコードを共有する必要が。ここには簡単なアプローチがあります: いくつのユニークなシンボルがあるかを調べ、正確にそのユニークなシンボルがたくさんある年だけを保持します。

import pandas as pd 
from io import StringIO 

df = pd.read_csv(StringIO(
'''Year Value Symbol 
2001 0.1  ABC 
2002 0.1  ABC 
2003 0.2  ABC 
2002 0.4  ZZZ 
2003 0.8  ZZZ 
2000 0.9  ASD 
2001 0.1  ASD 
2002 0.3  ASD 
2003 0.2  ASD'''), sep=r' +') 

unique_symbol_count = df.Symbol.value_counts().keys().shape[0] 
good_years_df = df.groupby('Year').filter(lambda gp: gp.Symbol.value_counts().shape[0] == unique_symbol_count) 

# Year Value Symbol 
# 1 2002 0.1 ABC 
# 2 2003 0.2 ABC 
# 3 2002 0.4 ZZZ 
# 4 2003 0.8 ZZZ 
# 7 2002 0.3 ASD 
# 8 2003 0.2 ASD 
関連する問題