问题
I have a column in a dataframe which is filled with booleans and i want to count how many times it changes from True to False.
I can do this when I convert the booleans to 1's and 0's ,then use df.diff
and then divide that answer by 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
My expected outcome would be
The amount of times False came up is 3
回答1:
You can perform a bitwise and of the Col1
with a mask indicating where changes occur in successive rows:
(df.Col1 & (df.Col1 != df.Col1.shift(1))).sum()
3
Where the mask, is obtained by comparing Col1
with a shifted version of itself (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
For multiple columns, you can do exactly the same (Here I tested with a col2
identical to col1
)
(df & (df != df.shift(1))).sum()
Col1 3
Col2 3
dtype: int64
回答2:
Notice that subtracting True
(1
) from False
(0
) in integer terms gives -1
:
res = df['Col1'].astype(int).diff().eq(-1).sum() # 3
To apply across a Boolean dataframe, you can construct a series mapping label to count:
res = df.astype(int).diff().eq(-1).sum()
回答3:
Just provide different idea
df.cumsum()[~df.Col1].nunique()
Out[408]:
Col1 3
dtype: int64
回答4:
My strategy was to find where the difference in one row to the next. (Considering that Trues are 1's and Falses are 0's, of course.)
Thus, Colm1 - Colm1.shift() represents the Delta value where a 1 is a shift from False to True, 0 No Change, and -1 shift from True to 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])
After getting the value counts as a dict of these [1, 0, -1] values, you can select for just the -1's and get the number of times the DF shifted to a False Value from a True Value. I hope this helped answer your question!
回答5:
Less concise but perhaps a more readable approach would be:
count = 0
for item in zip(d['Col1'], d['Col1'][1:]):
if item == (True, False):
count += 1
print(count)
来源:https://stackoverflow.com/questions/54219948/counting-the-amount-of-times-a-boolean-goes-from-true-to-false-in-a-column