2017-06-12 13 views
1

私は、タイムスタンプインデックス(数万のアイテム)といくつかのイベントに対応するタイムスタンプのリストを持つデータフレームを持っています。私は数分のイベントのいずれかの前に、N起こるデータフレームからすべての項目をマークする必要があるので、私は次のコードを書いた:パンダ.loc複数の割り当てと単一のもの

for timestamp in events: 
    df.loc[timestamp - timespan : timestamp, 'is_before_event'] = True 

それは非常に遅いことが判明したので、私は最初のインデックスを構築しようとしましたそれらのすべてに変更する必要があり、その後、単一代入を行うすべての要素:

for timestamp in events: 
    temp_index = temp_index.append(df.loc[timestamp - timespan : timestamp].index) 
df.loc[df.index.isin(temp_index), 'is_before_event'] = True 

このコードは、少なくとも100倍速い私の最初の試みよりも実行されます。

なぜこのような場合、この場合、割り当てを行う適切な方法は何ですか?

答えて

1

locのない列に論理マスクを割り当てることができると思います。TrueFalseの値が必要です。

numpy.concatenateをすべてのインデックスに含めるには、numpy.uniqueと重複を削除する必要があります。

temp_index = [] 
for timestamp in events: 
    temp_index.append(df.loc[timestamp - timespan : timestamp].index) 
df['is_before_event'] = df.index.isin(np.concatenate(temp_index)) 

サンプル(リスト内包で上記溶液と同じであるもの):

rng = pd.date_range('2017-04-03', periods=20, freq='T') 
df = pd.DataFrame({'a': range(20)}, index=rng) 
#print (df) 

events = pd.to_datetime(['2017-04-03 00:03:00', '2017-04-03 00:09:45']) 
t = pd.Timedelta('00:03:00') 

temp_index = [df.loc[timestamp - t : timestamp].index for timestamp in events] 
idx = np.unique(np.concatenate(temp_index)) 
df['is_before_event'] = df.index.isin(idx) 
print (df) 
         a is_before_event 
2017-04-03 00:00:00 0    True 
2017-04-03 00:01:00 1    True 
2017-04-03 00:02:00 2    True 
2017-04-03 00:03:00 3    True 
2017-04-03 00:04:00 4   False 
2017-04-03 00:05:00 5   False 
2017-04-03 00:06:00 6   False 
2017-04-03 00:07:00 7    True 
2017-04-03 00:08:00 8    True 
2017-04-03 00:09:00 9    True 
2017-04-03 00:10:00 10   False 
2017-04-03 00:11:00 11   False 
2017-04-03 00:12:00 12   False 
2017-04-03 00:13:00 13   False 
2017-04-03 00:14:00 14   False 
2017-04-03 00:15:00 15   False 
2017-04-03 00:16:00 16   False 
2017-04-03 00:17:00 17   False 
2017-04-03 00:18:00 18   False 
2017-04-03 00:19:00 19   False 

同様溶液:

temp_index = [df.loc[timestamp - t : timestamp].index for timestamp in events] 
idx = np.unique(np.concatenate(temp_index)) 
df['is_before_event'] = False 
df.loc[idx, 'is_before_event'] = True 
print (df) 
         a is_before_event 
2017-04-03 00:00:00 0    True 
2017-04-03 00:01:00 1    True 
2017-04-03 00:02:00 2    True 
2017-04-03 00:03:00 3    True 
2017-04-03 00:04:00 4   False 
2017-04-03 00:05:00 5   False 
2017-04-03 00:06:00 6   False 
2017-04-03 00:07:00 7    True 
2017-04-03 00:08:00 8    True 
2017-04-03 00:09:00 9    True 
2017-04-03 00:10:00 10   False 
2017-04-03 00:11:00 11   False 
2017-04-03 00:12:00 12   False 
2017-04-03 00:13:00 13   False 
2017-04-03 00:14:00 14   False 
2017-04-03 00:15:00 15   False 
2017-04-03 00:16:00 16   False 
2017-04-03 00:17:00 17   False 
2017-04-03 00:18:00 18   False 
2017-04-03 00:19:00 19   False 
関連する問題