我对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
谢谢!
答案 0 :(得分:1)
编辑2:针对某些澄清,我有一个新答案。
您要查找在TRUE
,0
或1
列中有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指出的那样,TRUE
和FALSE
是字符串,那很好,您只需要对第一步进行一些细微调整即可:
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()