使用如下所示的数据框:
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语句中的行来构建这些列表。我认为这不是最有效的方法。任何有关“正确”方式的帮助将非常感激。谢谢!
答案 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