我有一个布尔数据框。在每一行的位置,我们说一个“教室”,而每一列的标题是一个“ student_id”。教室设置为索引,我只想了解以下内容:
数据框如下所示:
df =pd.DataFrame({'classroom_id':[1,2,3,4], 'student_1':[True,True,True,True], 'student_2':[True,True,False,False], 'student_3':[True,False,False,False], 'student_4':[False,False,False,True]})
df = df.set_index('classroom_id')
例如,我只是不知道如何查询我想要的东西,
student_1和student_2多少次才是真实值?
或
student_1和student_2是教室中唯一的学生多少次?
预期结果:
1 (classroom 2)
但是,我不希望它返回:
2 (classroom 1 and classroom 2)
我只是不知道要为此输入熊猫的正确查询... 让我知道是否有任何问题,特别是关于我没有足够清楚地说明的问题。
答案 0 :(得分:0)
尝试一下
df =pd.DataFrame({'classroom_id':[1,2,3,4], 'student_1':[True,True,True,True], 'student_2':[True,True,False,False], 'student_3':[True,False,False,False], 'student_4':[False,False,False,True]})
df = df.set_index('classroom_id')
group_of_students = ["student_1","student_2"] # list the students you want to group together
cond1 = df[group_of_students].all(axis=1) # check for classrooms where these students all have True
cond2 = ~df.drop(group_of_students, axis=1).any(axis=1) # check for classrooms where all other students have False
df[cond1 & cond2] # filter df based on cond1 AND cond2
答案 1 :(得分:0)
您可以尝试使用布尔索引:
df[df['student_1'] & df['student_2'] & (df.sum(1) == 2)]
输出:
student_1 student_2 student_3 student_4
classroom_id
2 True True False False
要获得计数,您可以使用shape
:
df[df['student_1'] & df['student_2'] & (df.sum(1) == 2)].shape[0]
输出:
1