2016-10-21 3 views
5

У меня есть две серии данных bool, которые я хотел бы объединить с новым объектом серии, но логика комбинации зависит от «истории» (предыдущие значения).Объединение двух рядов pandas с изменяющейся логикой

Серия 1 содержит в основном False, но не содержит значения True. Series2 обычно содержит периоды значений True или False - вероятность повторения значений довольно высока.

В результирующей серии мне нужны периоды значений bool, которые начинаются с раздела True, когда оба значения True и заканчиваются, когда раздел в Series2 заканчивается, i. е. больше не содержит True.

e. г.

s1   s2   result 
0 False  False  False 
1 False  True  False 
2 True  True  True 
3 False  True  True 
4 False  True  True 
5 True  False  False 
6 False  False  False 

В строке 2 результат переключается на Истинные и остается включенным, пока True-фаза в Series2 заканчивается на строке 5.

Это то, что я придумал до сих пор:

import pandas as pd 
import numpy as np 
x = pd.DataFrame() 
x['s1'] = [False, False, True, False, False, True, False] 
x['s2'] = [False, True, True, True, True, False, False] 
x['start'] = (x['s1'] & x['s2']).replace(False, np.nan) 
x['end'] = (~ (x['s2'].shift() & (~ x['s2']))).replace(True, np.nan) 
x['result'] = x['start'].fillna(x['end']).fillna(method='ffill').fillna(0) > 0 
x 

Несмотря на то, что мое решение работает, у меня создалось впечатление, что я слишком много понимаю, чтобы достичь этого !?

Любые предложения?

ответ

1

Во-первых, мы знаем наверняка, что result всегда Ложные когда s2 является ложным, и всегда верно, когда оба s1 и s2 истинны. Это не зависит от предыдущих значений:

x.loc[~x['s2'], 'result'] = False 
x.loc[x['s1'] & x['s2'], 'result'] = True 

Затем мы заполняем NA с «вперед заполнить»:

x['result'].fillna(method = 'ffill', inplace = True) 

И в случае, если есть некоторые NA остающиеся в начале колонки, мы заменим их с False:

x['result'].fillna(False, inplace = True) 
+0

Это выглядит хорошо для меня. FWIW, несколько более компактный способ сделать первые 2 строки: 'x.loc [x.s1 | ~ x.s2, 's3'] = x.s2' – JohnE

Смежные вопросы