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

时间:2018-11-12 19:40:34

标签: python pandas series

我有一个小型数据框,其中的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时的值)

我想返回每个参数的最后一个连续True值的索引,该索引从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

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

(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的开头或结尾开始,因为每个系列中可能还有其他True值,它们不是从0.0开始连续的。

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

1 个答案:

答案 0 :(得分:1)

我们需要为连续的True / False组创建一个计数器。然后找到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