计算列中布尔值从True变为False的次数

时间:2019-01-16 15:06:37

标签: python pandas series

我在数据框中有一个用布尔值填充的列,我想计算它从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 :(得分:5)

您可以执行Col1中的bitwise and并带有掩码,以指示连续行中更改的位置:

(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

答案 1 :(得分:3)

请注意,以整数项从True1)中减去False0)得到-1

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

要应用于布尔数据框,可以构造一个序列映射标签以进行计数:

res = df.astype(int).diff().eq(-1).sum()

答案 2 :(得分:2)

只提供不同的想法

df.cumsum()[~df.Col1].nunique()
Out[408]: 
Col1    3
dtype: int64

答案 3 :(得分:1)

我的策略是找到一行与另一行之间的差异。 (当然,考虑True为1,False为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从“真值”转换为“假值”的次数。我希望这有助于回答您的问题!

答案 4 :(得分:1)

简洁但可能更具可读性的方法是:

count = 0
for item in zip(d['Col1'], d['Col1'][1:]):
    if item == (True, False):
        count += 1
print(count)