Python 如何有效地查找数据帧中交替布尔值的索引

Python 如何有效地查找数据帧中交替布尔值的索引,python,pandas,boolean,logic,dataframe,Python,Pandas,Boolean,Logic,Dataframe,使用如下所示的数据帧: A B 0 True False 1 True False 2 True False 3 False True 4 False False 5 True False 我需要得到a列和b列之间交替布尔的索引列表。因此,当A列第一次显示为True时,我可以将0添加到列表中。现在我切换到B列,找到0之后的下一个索引,它显示True,即3。然后我切换回A列,添加下一个索引,在索引3之后显示True

使用如下所示的数据帧:

       A      B  
0   True  False  
1   True  False  
2   True  False  
3  False   True  
4  False  False  
5   True  False
我需要得到a列和b列之间交替布尔的索引列表。因此,当A列第一次显示为True时,我可以将0添加到列表中。现在我切换到B列,找到0之后的下一个索引,它显示True,即3。然后我切换回A列,添加下一个索引,在索引3之后显示True。最后,我将有一个值为[0,3,5]的列表。我目前正在通过遍历for循环中的行和if语句来构建这些列表。我认为这不是最有效的方法。任何关于“正确”方法的帮助都将不胜感激。谢谢

这样更好吗

inputList=[(True,False),(True,False),(True,False),
          (False,True),(False,False),(True,False)]
l=list()
toggle=0

for i in range(0,len(inputList)):
    if (inputList[i][toggle%2]==True):
        l.append(i)
        toggle+=1
print l

一种方法可能是这样的:

在[3]中:

df['C'] = df.A.astype(int) - df.B.astype(int)
df['D'] = df[['C']].apply(lambda x: (x != x.shift()).astype(int).cumsum())
df[(df.C == 1) | (df.C == -1)].groupby('D').head(1).index
出[3]:

Int64Index([0, 3, 5], dtype='int64')
我没有对它进行过广泛的测试,但它可以与您提供的示例一起使用,包括这一个:

df = pd.DataFrame({'A': [True, True, False, True, False, False, True], 
                   'B': [False, False, True, False, False, True, False]})
在[4]中:

df['C'] = df.A.astype(int) - df.B.astype(int)
df['D'] = df[['C']].apply(lambda x: (x != x.shift()).astype(int).cumsum())
df[(df.C == 1) | (df.C == -1)].groupby('D').head(1).index.tolist()
出[4]:

[0, 2, 3, 5, 6]

如果您需要任何意见,请随时发表。谢谢您的回答。我以前从未与groupby合作过,所以我很难理解它是如何工作的。尤其是当它的groupby超过一列时。我用不同的数据帧测试了您的代码,但它没有给出我所期望的结果。A=[True,True,False,True,False,True]B=[False,False,True,False,True,False]得到的是[0,2,5],而不是[0,2,3,5,6],很难高估
.groupby
操作的重要性,因此我鼓励您在论坛的或此处查看示例。理解代码的最好方法是将其分解,并查看其功能。我已经更新了代码以考虑到这个新案例。我很肯定它现在在任何情况下都能正常工作。因为你没有在任何地方提到它,所以它会忽略
A
B
都是
True
的行。但是您可以在代码设置条件的第3行将其更改为
df.C!=0