结合两个大熊猫系列与改变逻辑

时间:2016-10-21 14:38:17

标签: python pandas series

我有两个系列的bool数据,我想要组合到一个新的系列对象,但组合逻辑取决于"历史" (以前的值)。

Series1主要包含False,但包含单个True值。 Series2通常包含True或False值的句点 - 重复值的概率非常高。

在结果系列中,我需要两个bool值的句点,每当两个都为True时以True段开头,并且当Series2中的段结束时结束,i。即不再包含True。

即克。

  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中的True-phase在第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 个答案:

答案 0 :(得分:1)

首先,我们确信当result为假时s2始终为假,而s1s2均为真时始终为真。这不依赖于以前的值:

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)