我在数据框中有一个用布尔值填充的列,我想计算它从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
答案 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)
请注意,以整数项从True
(1
)中减去False
(0
)得到-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)