我有一个小型数据框,其中的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数组方法的创新解决方案,但它们看起来相当复杂。
答案 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