2016-10-21 4 views
5

私は新しいシリーズオブジェクトに結合したい2つの一連のブールデータを持っていますが、組み合わせロジックは「履歴」(以前の値)に依存します。2つのパンダシリーズを変更するロジックを組み合わせる

Series1はほとんどがFalseですが、単一のTrue値を含みます。 Series2には通常TrueまたはFalseの値のピリオドが含まれています。値を繰り返す確率はかなり高いです。

結果のシリーズでは、真であり、Series2のセクションが終了するときに終了するときにTrue-sectionで始まるbool値の期間が必要です。 e。 Trueを含まなくなりました。

e。 g。行結果がTrueに切り替わり、シリーズ2における真の相が行に終了するまで、オンのまま2では

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 

は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

まず、我々はs1s2の両方に該当する場合resultは常に真s2がFalseのときは常にFalseで、かついることを確実に知ります。その後、我々は「埋める前進」とNAのを埋める

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

::それは以前の値に依存しない

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

とケースにいくつかのNAの残りの列の先頭ではありますが、我々はそれらを交換します偽で:

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

これは私によく見えます。 FWIWは、最初の2行をややコンパクトにする方法です: 'x.loc [x.s1 | 〜x.s2、 's3'] = x.s2' – JohnE

関連する問題