我已经像下面那样使用了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。
答案 0 :(得分:0)
您似乎希望计算没有通过任何考试(通过所有考试)的学生人数。您在分组方面正处于正确的轨道...但是我不确定为什么要按id
和testname
进行分组。
有时候,在这些类型的问题中,您正在寻找“没有任何负面结果的那些”,您可以更轻松地计算出具有任何负面结果的那些,并将其从原始数据集大小中减去。这是一种方法:
注意:您当然可以将其中的一些内容链接在一起,为了清楚起见,我将其分解了。
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