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

时间:2015-02-09 05:56:56

标签: 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。最后我将得到一个包含值的列表[0,3,5]。我正在通过迭代for循环和if语句中的行来构建这些列表。我认为这不是最有效的方法。任何有关“正确”方式的帮助将非常感激。谢谢!

2 个答案:

答案 0 :(得分:1)

一种方式可能是这样的:

在[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]

答案 1 :(得分:0)

这样更好吗?

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