Подсчет количества переходов логического значения от Истинного к Ложному в столбце

Вы можете использовать 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.

6
задан jpp 16 January 2019 в 15:26
поделиться

4 ответа

Обратите внимание, что вычитание True (1) из False (0) в целочисленных терминах дает -1:

res = df['Col1'].astype(int).diff().eq(-1).sum()  # 3

Для применения к булевому фрейму данных вы можете построить метка сопоставления серии для подсчета:

res = df.astype(int).diff().eq(-1).sum()
0
ответ дан jpp 16 January 2019 в 15:26
поделиться

Моя стратегия заключалась в том, чтобы найти, где разница в одном ряду с другим. (Учитывая, что «Истины» равны 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 смещен к ложному значению. из истинного значения. Я надеюсь, что это помогло ответить на ваш вопрос!

0
ответ дан Hayden McCormick 16 January 2019 в 15:26
поделиться

Просто предоставьте другую идею

df.cumsum()[~df.Col1].nunique()
Out[408]: 
Col1    3
dtype: int64
0
ответ дан Wen-Ben 16 January 2019 в 15:26
поделиться

Менее сжатый, но, возможно, более читабельный подход будет:

count = 0
for item in zip(d['Col1'], d['Col1'][1:]):
    if item == (True, False):
        count += 1
print(count)
0
ответ дан alec_djinn 16 January 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: