Вы можете использовать memoization . Это метод, который используется для того, чтобы избежать выполнения одного и того же вычисления дважды, сохраняя где-то результат для каждого рассчитанного значения. Я видел, что уже есть ответ, который использует memoization, но я хотел бы предложить общую реализацию, используя декораторы python:
def memoize(func):
def wrapper(*args):
if args in wrapper.d:
return wrapper.d[args]
ret_val = func(*args)
wrapper.d[args] = ret_val
return ret_val
wrapper.d = {}
return wrapper
@memoize
def f(x):
...
Теперь f
- это сама memoized версия. С этой реализацией вы можете memoize любую функцию, используя декоратор @memoize
.
Обратите внимание, что вычитание True
(1
) из False
(0
) в целочисленных терминах дает -1
:
res = df['Col1'].astype(int).diff().eq(-1).sum() # 3
Для применения к булевому фрейму данных вы можете построить метка сопоставления серии для подсчета:
res = df.astype(int).diff().eq(-1).sum()
Моя стратегия заключалась в том, чтобы найти, где разница в одном ряду с другим. (Учитывая, что «Истины» равны 1, а «Ложь» - 0).
Таким образом, Colm1 - Colm1.shift () представляет значение Delta, где 1 - это сдвиг от False к True, 0 - без изменений, и -1 сдвиг от истинного к ложному.
import pandas as pd
d = {'Col1': [True, True, True, False, False, False, True, True, True, True, False, False, False, True, True, False, False, True, ]}
df = pd.DataFrame(data=d)
df['delta'] = df['Col1'] - df['Col1'].shift()
BooleanShifts = df['delta'].value_counts()
print(BooleanShifts[-1])
После того, как значение подсчитано как число этих [1, 0, -1] значений, вы можете выбрать только -1 и получить количество раз, когда DF смещен к ложному значению. из истинного значения. Я надеюсь, что это помогло ответить на ваш вопрос!
Просто предоставьте другую идею
df.cumsum()[~df.Col1].nunique()
Out[408]:
Col1 3
dtype: int64
Менее сжатый, но, возможно, более читабельный подход будет:
count = 0
for item in zip(d['Col1'], d['Col1'][1:]):
if item == (True, False):
count += 1
print(count)