【问题标题】:Combining two pandas series with changing logic结合逻辑变化的两个熊猫系列
【发布时间】:2016-10-21 14:38:17
【问题描述】:

我有两个系列的布尔数据,我想将它们组合成一个新的系列对象,但组合逻辑取决于“历史”(以前的值)。

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

在结果系列中,我需要以 True-section 开头的 bool 值周期,只要两者都为 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

即使我的解决方案有效,但我觉得我想实现这个目标太难了!?

有什么建议吗?

【问题讨论】:

    标签: python pandas series


    【解决方案1】:

    首先,我们确定当s2 为假时result 始终为假,当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)
    

    【讨论】:

    • 这对我来说看起来不错。 FWIW,执行前 2 行的稍微更紧凑的方法是:x.loc[ x.s1 | ~x.s2, 's3' ] = x.s2
    猜你喜欢
    • 2014-10-20
    • 2020-05-14
    • 1970-01-01
    • 2018-04-23
    • 2018-11-01
    • 2019-06-06
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多