在3列中条件为真时获取索引号

时间:2019-08-21 15:46:23

标签: python pandas numpy indexing

我对python中的某些代码有疑问。我尝试在3个不同的列中满足条件TRUE时提取第一行的索引。这是我正在使用的数据:

       0       1       2             3           4
0   TRUE    TRUE    TRUE    0.41871395  0.492517879
1   TRUE    TRUE    TRUE    0.409863582 0.519425031
2   TRUE    TRUE    TRUE    0.390077415 0.593127232
3   FALSE   FALSE   FALSE   0.372020631 0.704367199
4   FALSE   FALSE   FALSE   0.373546556 0.810876797
5   FALSE   FALSE   FALSE   0.398876919 0.86855678
6   FALSE   FALSE   FALSE   0.432142094 0.875576037
7   FALSE   FALSE   FALSE   0.454115421 0.863063448
8   FALSE   TRUE    FALSE   0.460676901 0.855739006
9   FALSE   TRUE    FALSE   0.458693197 0.855128636
10  FALSE   FALSE   FALSE   0.459201839 0.856451104
11  FALSE   FALSE   FALSE   0.458693197 0.855739006
12  FALSE   FALSE   FALSE   0.458082827 0.856349376
13  FALSE   FALSE   FALSE   0.456556902 0.856959746
14  TRUE    TRUE    TRUE    0.455946532 0.858180486
15  TRUE    TRUE    TRUE    0.455030976 0.858790857
16  TRUE    TRUE    TRUE    0.454725791 0.858485672
17  FALSE   FALSE   FALSE   0.454420606 0.857875301
18  FALSE   FALSE   FALSE   0.454725791 0.858383943
19  FALSE   TRUE    FALSE   0.453199866 0.856654561
20  FALSE   FALSE   FALSE   0.451979125 0.856349376
21  FALSE   FALSE   FALSE   0.45167394  0.856959746
22  FALSE   FALSE   FALSE   0.451775669 0.857570116
23  FALSE   FALSE   FALSE   0.45106357  0.857264931
24  TRUE    TRUE    TRUE    0.450758385 0.856654561
25  TRUE    TRUE    TRUE    0.4504532   0.856044191
26  TRUE    TRUE    TRUE    0.449232459 0.856349376
27  TRUE    TRUE    TRUE    0.448316904 0.855535549

并且只有在存在3个“ True”条件时,我才需要获取索引号:

0   
14  
24

谢谢!

7 个答案:

答案 0 :(得分:1)

编辑2:针对某些澄清,我有一个新答案。

您要查找在TRUE01列中有2的每一行,但是您想忽略这样的行:他们中的第一个。我的答案的第一部分仍然是相同的,我认为您应该创建一个掩码来选择TRUE三元组行:

condition = df[[0, 1, 2]].all(axis='columns')

但是,现在我提出一种可能的方法来过滤出您要忽略的行。在TRUE三元组行中排在第一位意味着前一行也满足condition

idx = df[condition].index
ignore = idx.isin(idx + 1)
result = idx[~ignore]

换句话说,忽略索引值是满足condition的索引值的后继项的行。

希望这会有所帮助!


保留原始答案以保存记录:

我认为您可以通过将其分为两个步骤来获得最易读的解决方案:

首先,找出您感兴趣的列中all的哪些行具有值True

condition = df[[0, 1, 2]].all(axis='columns')

然后,您感兴趣的索引值就是df[condition].index

编辑:如果正像Benoit指出的那样,TRUEFALSE是字符串,那很好,您只需要对第一步进行一些细微调整即可:

condition = (df[[0, 1, 2]] == 'TRUE').all(axis='columns')

答案 1 :(得分:1)

我想每个人都错过了“提取第一行的索引”部分。一种方法是先删除连续的重复项,然后获取三个都为True的索引,这样您就只能得到真相的第一行

df=df[['0', '1', '2']]
df=df[df.shift()!=df].dropna().all(axis=1)
print(df[df].index.tolist())

输出:

[0, 14, 24]

答案 2 :(得分:1)

我在演示数据帧上尝试了此方法,似乎对我有用。



df = pd.DataFrame(data={'A':[True,True,True,True,True,False,True,True],'B':[True,True,False,True,True,False,True,True],'C':[True,False,True,True,True,False,True,True]})
i =df[(df['A']==True) & (df['B']==True) & (df['C']==True)].index.to_list()

i = [x for x in i if x-1 not in i]

答案 3 :(得分:1)

如果您DataFrame中的TRUE和FALSE实际上是布尔值True和False,那么

.home-inner {
  background-image: url(./assets/img/intro.jpg)
}

答案 4 :(得分:1)

我认为这可以解决问题。不过,作为一般建议,在熊猫中命名列总是有帮助的。

假设您的熊猫数据框被命名为data:

data[(data[0] == True) & (data[1] == True) & (data[2] == True)].index.values

list(data[(data[0] == True) & (data[1] == True) & (data[2] == True)].index.values)

答案 5 :(得分:0)

无论您希望检查True值的3列的位置如何,以下内容都将起作用,并返回一个列表,指示哪些行具有3个True值:

编辑:

现在已更新,可以更好地适应OP的原始请求:

#df.iloc[:,:3] = df.iloc[:,:3].apply(lambda x: str(x) == "TRUE")    # If necessary
s = (df == True).apply(sum, axis=1) == 3
s = s[s.shift() != s]
s.index[s].tolist()

答案 6 :(得分:0)

基于答案here,类似这样的东西将提供满足所有条件的行的索引列表:

df[(df[0]==True) & (df[1]==True) & (df[2]==True)].index.tolist()