计算仅特定列为True的行

时间:2019-06-27 19:48:59

标签: python python-3.x pandas dataframe

我有一个布尔数据框。在每一行的位置,我们说一个“教室”,而每一列的标题是一个“ student_id”。教室设置为索引,我只想了解以下内容:

  • 对于(student_ids)的各种分组,它们进行了多少次,并且只能共享一间教室。

数据框如下所示:

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)

我只是不知道要为此输入熊猫的正确查询... 让我知道是否有任何问题,特别是关于我没有足够清楚地说明的问题。

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