2016-10-21 59 views
5

我有兩個系列的bool數據,我想合併成一個新的系列對象,但組合邏輯依賴於「歷史」(以前的值)。將兩個熊貓系列與變化的邏輯相結合

Series1包含大多數False,但單個True值。 Series2通常包含True或False值的週期 - 重複值的概率非常高。

在結果序列中,我需要布爾值的時間段,以True部分開始,每當兩個部分都爲True時結束,當Series2部分結束時結束。即不再包含True。

e。 G。

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行的結果切換到真和巋然不動,直到真相系列2在行結束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爲False,與時俱s1s2是真總是如此。這並不取決於以前的值:

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

然後填寫NA與「前進補」:

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

而且萬一有一些不適用的其餘在欄的開頭,我們拆換假:

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

這對我來說很好。 FWIW,做前兩行稍微更緊湊的方法是:'x.loc [x.s1 | 〜x.s2,'s3'] = x.s2' – JohnE