2017-12-22 4 views
2

巨大なtimeseries DataFrame(約100,000,000行)があり、条件によって行をフィルタリングする必要があります。別のデータフレームの各行に各条件があります。このDataframeには約2000行があり、各行は条件です。 玩具例:条件が別のDataFrameの行である場合のDataFrameの行のフィルタリング

df = pd.DataFrame({val: [1, 3, 2, 4, 3, 1, 2, 3], date: [2015-03-12, 2015-04-12, 2015-05-13, 2016-03-12, 2016-04-07, 2016-05-12, 2017-01-11, 2017-03-20]}) 
df_condition = pd.DataFrame({val: [2, 3], date: [2015-07-13, 2016-04-08]}) 

条件valはdf_conditionの日付よりも早く表示される場所、DFにすべてのRAWを削除された約2000の条件

私はこの方法を使用する上

df = df[(df['val']==2) & (df['date']>'2015-07-13')] 
df = df[(df['val']==3) & (df['date']>'2016-04-08')] 

などを、しかしそれは長すぎる(約5時間)。より速い方法がありますか?

vals = df_condition.val.values 
dates = vals = df_condition.dates.values 
for i in range(len(df_condition)): 
    df = df[~((df.val==vals[i])&(df.date < dates[i]))] 

答えて

2

私はあなたがすべてのマスクのリストを作成し、reduceことができると信じて:

masks = [(df.val==x.val)&(df.date >= x.date) for x in df_condition.itertuples()] 
print (masks) 
[0 False 
1 False 
2 False 
3 False 
4 False 
5 False 
6  True 
7 False 
dtype: bool, 0 False 
1 False 
2 False 
3 False 
4 False 
5 False 
6 False 
7  True 
dtype: bool] 

df1 = df[np.logical_and.reduce(masks)] 
+0

とてもエレガントかつ迅速な方法をありがとう! –

関連する問題