将两个 pandas 系列与不断变化的逻辑相结合
Combining two pandas series with changing logic
我有两个 bool 数据系列,我想将它们组合成一个新的系列对象,但组合逻辑取决于 "history"(先前的值)。
Series1 主要包含 False,但只有一个 True 值。
Series2 通常包含 True 或 False 值的周期 - 重复值的概率相当高。
在结果系列中,我需要 bool 值的周期,只要两者都为 True,它们就以 True 部分开始,并在 Series2 中的部分结束时结束,即。 e.不再包含 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 行中,结果切换为 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
尽管我的解决方案有效,但我觉得我想实现这个目标太难了!?
有什么建议吗?
首先,我们确定当 s2
为 False 时 result
始终为 False,而当 s1
和 s2
均为 True 时始终为 True。这不取决于以前的值:
x.loc[~x['s2'], 'result'] = False
x.loc[x['s1'] & x['s2'], 'result'] = True
然后我们用 "forward fill":
填充 NA
x['result'].fillna(method = 'ffill', inplace = True)
如果列的开头还有一些 NA,我们将它们替换为 False:
x['result'].fillna(False, inplace = True)
我有两个 bool 数据系列,我想将它们组合成一个新的系列对象,但组合逻辑取决于 "history"(先前的值)。
Series1 主要包含 False,但只有一个 True 值。 Series2 通常包含 True 或 False 值的周期 - 重复值的概率相当高。
在结果系列中,我需要 bool 值的周期,只要两者都为 True,它们就以 True 部分开始,并在 Series2 中的部分结束时结束,即。 e.不再包含 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 行中,结果切换为 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
尽管我的解决方案有效,但我觉得我想实现这个目标太难了!?
有什么建议吗?
首先,我们确定当 s2
为 False 时 result
始终为 False,而当 s1
和 s2
均为 True 时始终为 True。这不取决于以前的值:
x.loc[~x['s2'], 'result'] = False
x.loc[x['s1'] & x['s2'], 'result'] = True
然后我们用 "forward fill":
填充 NAx['result'].fillna(method = 'ffill', inplace = True)
如果列的开头还有一些 NA,我们将它们替换为 False:
x['result'].fillna(False, inplace = True)