如何获取DataFrame中多列同时满足指定值的首个行索引?
搞定这个索引筛选问题!
嗨,我知道你现在卡在怎么从这个DataFrame里找出flag1和flag2都是1的第一行索引了,之前的代码报错其实是个很容易踩的小坑——运算符优先级搞混了!
你写的df.flag1 == 1.0 & df.flag2 == 1.0会被Python优先解析成df.flag1 == (1.0 & df.flag2) == 1.0,这完全不是你想要的“两个条件同时满足”的逻辑,自然会报错啦。
正确的写法来啦
只需要给每个判断条件单独加上括号,让程序先判断每一列的条件,再做逻辑与操作就行:
import pandas as pd import numpy as np # 你的示例DataFrame df = pd.DataFrame({ 'seq':[0,1,2,3,4,5,6,7,8,9,10,11], 'flag1':[np.nan,np.nan,1,1,1, 0,-1,-1,1,1,1,0], 'flag2':[np.nan,np.nan,np.nan,0, 0,0,-1,-1,0,1, 0,1] }) # 正确筛选并获取第一行索引 target_index = df[(df.flag1 == 1.0) & (df.flag2 == 1.0)].index[0] print(target_index) # 输出正好是你要的9!
额外小提示
- 如果你的数据里有更多空值情况,担心干扰筛选,可以加上
notna()来排除空值行(不过你的示例里目标行没有空值,所以不用,但留着备用总没错):target_index = df[(df.flag1.notna()) & (df.flag1 == 1.0) & (df.flag2.notna()) & (df.flag2 == 1.0)].index[0] - 用
loc写法会更清晰,也能达到同样效果:target_index = df.loc[(df.flag1 == 1.0) & (df.flag2 == 1.0), :].index[0]
这样就能顺利拿到你想要的索引啦!
内容的提问来源于stack exchange,提问作者ds_student




