有没有一种惯用的熊猫方法可以从代表开始和停止信号的 2 个列表中获取索引



>我有这样的列表:

index   A        B
0       false    true
1       false    false
2       true     false
3       false    false
4       false    false
5       false    false
6       true     false
7       false    false
8       false    true
9       false    false
10      false    false
11      true     false
12      false    false

我需要的输出是(2,8(

逻辑是,一旦在 A 中检测到 true,我将在 B 中寻找下一个 true,而忽略 A 中的任何其他 true。

在实践中,它会这样做:

index   A        B
0       false    true   // ignore the true in B
1       false    false
2       true     false  <- start
3       false    false
4       false    false
5       false    false
6       true     false  // ignore the true in A
7       false    false
8       false    true   <- end
9       false    false
10      false    false
11      true     false  <- start again
12      false    false

所以我可以在循环中完成(伪代码(:

for i in a.index:
for j in b.index[i + 1:]:
if b[j]:
# write i and j somewhere
i = j
break

它是伪代码,因为 i = j 行不起作用

有没有熊猫式的解决方案来实现这一点?

这与我之前的问题非常相似(通过比较两列来跟踪 Pandas 中的状态反转(,但主要区别在于,一旦检测到开始("A"列(,我想忽略所有这些,直到有一个停止("B"列(

到目前为止,我发现的最快的"循环"解决方案是:

i = 0
while i < len(A):
start = A[i:].idxmax()
stop = B[start + 1:].idxmax()
print(start, stop)
i = stop
a = [False, True, False, True]
b = [True, False, False, True]
if True in a:
aNum = a.index(True)
bNum = b[aNum:].index(True) + aNum if True in b[aNum:] else None
else:
aNum = None
bNum = None
print((aNum, bNum))

输出

(1, 3)

修改上一个答案以允许继续:

def getNextPair(aTotal, bTotal):
curPos = 0
while True:
a = aTotal[curPos:]
b = bTotal[curPos:]
if True in a:
aNum = a.index(True)
bNum = b[aNum:].index(True) + aNum if True in b[aNum:] else None
if aNum is not None:
aNum += curPos
if bNum is not None:
bNum += curPos
else:
aNum = None
bNum = None
if aNum is not None or bNum is not None:
yield((aNum, bNum))
if bNum is None:
break
curPos = bNum + 1

a = [False, True, False, True, True, True, False, False, True, True]
b = [True, False, False, False, True, False, True, True, False, True]
for startStop in getNextPair(a, b):
print(startStop)

输出

(1, 4)
(5, 6)
(8, 9)

相关内容

最新更新