代码之家  ›  专栏  ›  技术社区  ›  Bill

有没有一种简单的方法可以找到熊猫系列中最后一个连续的真值?

  •  0
  • Bill  · 技术社区  · 6 年前

    我有一个小数据框,其中bool值表示三个参数的最佳范围。

    在调试器中如下所示:

    (Pdb) p insensistive_ranges.loc[-0.2:0.2]
               P      Q      n
    -0.20  False   True  False
    -0.16  False   True  False
    -0.12   True   True  False
    -0.08   True   True  False
    -0.04   True  False  False
     0.00   True   True   True
     0.04  False  False   True
     0.08  False   True   True
     0.12  False   True  False
     0.16  False   True  False
    

    (当指数==0.00时为最佳值)

    我想返回最后一个连续真值的索引,从0.0开始向上计数,也从0.0开始向下计数。换句话说,这是:

    (Pdb) p highest
    P    0.00
    Q    0.00
    n    0.08
    (Pdb) p lowest
    P   -0.12
    Q    0.00
    n    0.00
    

    最接近的是这个,但它在每个方向上都走得太远了一步(找到第一个非真值而不是最后一个连续的真值):

    (Pdb) p insensistive_ranges.loc[0.0:delta].idxmin()
    P    0.04
    Q    0.04
    n    0.12
    (Pdb) p insensistive_ranges.loc[0.0:-delta:-1].idxmin()
    P   -0.16
    Q   -0.04
    n   -0.04
    

    有什么想法吗?

    (请注意,您不能从 insensistive_ranges 因为从0.0开始,每个序列中可能有其他不连续的真值。

    This question 有一些创新的解决方案与numpy数组方法,但他们看起来相当复杂。

    1 回复  |  直到 6 年前
        1
  •  1
  •   ALollz    6 年前

    我们需要为连续的真/假组创建一个计数器。然后为每个列找到 0 组。

    df1 = df.ne(df.shift(1)).cumsum().copy()
    
    # Lowest
    df1.eq(df1.loc[0]).idxmax()
    P   -0.12
    Q    0.00
    n    0.00
    dtype: float64
    
    # Highest
    df1.eq(df1.loc[0])[::-1].idxmax()
    #P    0.00
    #Q    0.00
    #n    0.08
    #dtype: float64