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

У меня есть столбец в кадре данных, который заполнен логическими значениями, и я хочу подсчитать, сколько раз он меняется с True на False.

Я могу сделать это, когда я преобразовываю логические значения в 1 и 0, затем использую df.diff и затем делю этот ответ на 2

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)


print(df)

0    True
1    True
2    True
3   False
4   False
5   False
6    True
7    True
8    True
9    True
10  False
11  False
12  False
13   True
14   True
15  False
16  False

Мой ожидаемый результат будет The amount of times False came up is 3

Ответы [ 5 ]

0 голосов
/ 16 января 2019

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

count = 0
for item in zip(d['Col1'], d['Col1'][1:]):
    if item == (True, False):
        count += 1
print(count)
0 голосов
/ 16 января 2019

Моя стратегия заключалась в том, чтобы найти, где разница в одном ряду с другим. (Учитывая, что Истины 1, а Ложь 0, конечно.)

Таким образом, Colm1 - Colm1.shift () представляет значение Delta, где 1 - это сдвиг от False до True, 0 без изменений и -1 - от True до False.

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 голосов
/ 16 января 2019

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

df.cumsum()[~df.Col1].nunique()
Out[408]: 
Col1    3
dtype: int64
0 голосов
/ 16 января 2019

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

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

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

res = df.astype(int).diff().eq(-1).sum()
0 голосов
/ 16 января 2019

Вы можете выполнить bitwise and из Col1 с маской, указывающей, где происходят изменения в последовательных строках:

(df.Col1 & (df.Col1 != df.Col1.shift(1))).sum()
3

Где маска получается путем сравнения Col1 со смещенной версией самого себя (pd.shift):

df.Col1 != df.Col1.shift(1)

0      True
1     False
2     False
3      True
4     False
5     False
6      True
7     False
8     False
9     False
10     True
11    False
12    False
13     True
14    False
15    False
16    False
17    False
Name: Col1, dtype: bool

Для нескольких столбцов вы можете сделать то же самое (Здесь я тестировал с col2, идентичнымcol1)

(df & (df != df.shift(1))).sum()

Col1    3
Col2    3
dtype: int64
...