如何使用python pandas根据条件创建“计数”列?

时间:2019-12-30 15:21:55

标签: python pandas pandas-groupby

我已经像下面那样使用了groupby,但是没有用:

df={ 'id' :[1,1, 2,2, 3], 'testname' : ['math', 'science', 'math', 'literature', 'math'], 'result' :['passed', 'failed', 'passed', 'passed', 'failed'}


    ndf=df.groupby(['id', 'testname']) ['result']. count() 

示例数据框:

Id  testname.    result
1.     math.           passed
1.     science.      failed 
2.     math.           passed
2.     literature.    passed
3.     math.           failed

根据条件:如果ID通过他参加的所有考试,则count + = 1,否则count = 0。

因此,输出应类似于:

预期输出: 获得总价值->总合格学生将为1。

2 个答案:

答案 0 :(得分:0)

您似乎希望计算没有通过任何考试(通过所有考试)的学生人数。您在分组方面正处于正确的轨道...但是我不确定为什么要按idtestname进行分组。

有时候,在这些类型的问题中,您正在寻找“没有任何负面结果的那些”,您可以更轻松地计算出具有任何负面结果的那些,并将其从原始数据集大小中减去。这是一种方法:

  1. 使用过滤器查找失败的任何行
  2. 按ID对结果进行分组,所以现在我们有一个基础来计算每个失败的人
  3. 从唯一ID的原始数量中减去

注意:您当然可以将其中的一些内容链接在一起,为了清楚起见,我将其分解了。

In [25]: df                                                                     
Out[25]: 
   id    testname  result
0   1        math  passed
1   1     science  failed
2   2        math  passed
3   2  literature  passed
4   3        math  failed

In [26]: failed_df = df[df['result']=='failed']                                 

In [27]: ids_with_failures = len(failed_df)                                     

In [28]: tot_ids = len(df.groupby('id'))                                        

In [29]: count = tot_ids - ids_with_failures                                    

In [30]: count                                                                  
Out[30]: 1

答案 1 :(得分:0)

df = pd.DataFrame({'id': [1, 1, 2, 2, 3],
                   'testname': ['math', 'science', 'math', 'literature', 'math'],
                   'result': ['passed', 'failed', 'passed', 'passed', 'failed']})

如果一系列中的所有条目都等于“通过”,则下面的此函数返回True。换句话说,如果学生至少一次没有“通过”,它将返回False。

def verify_all_exams_are_passed(results):
    return results.eq('passed').all()

最后,将该功能应用于每个学生(id),以查看哪些学生通过了所有考试。

>>> students_passed = df.groupby('id')['result'].apply(verify_all_exams_are_passed)

>>> students_passed
id
1    False
2     True
3    False
Name: result, dtype: bool

您也可以直接对本系列进行总结,以获得通过所有考试的学生人数

>>> total_passed.sum()
1