Есть ли простой способ найти последнее значение Истины в серии Панд? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть небольшой фрейм данных со значениями 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

Самое близкое, что я получил, это, но он идет на один шаг слишком далеко в каждом направлении (находит первое не-Истинное значение, а не последнее последовательное значение Истина):

(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.

В этом вопросе есть несколько инновационных решений с использованием методов с массивными массивами, но они выглядят довольно сложными.

1 Ответ

0 голосов
/ 12 ноября 2018

Нам нужно создать счетчик для последовательных групп 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
...