如何在Pandas DataFrame中统计用户首次答对的唯一题目数量并生成统计报表
解决Pandas中统计用户首次答对题目数量的问题
现有DataFrame结构
user_id:代表用户IDquestion_id:代表题目编号user_answer:用户针对该题选择的选项(可选值为A、B、C、D)correct_answer:该题的正确答案correct:标记用户答案是否正确,0.0表示错误,1.0表示正确elapsed_time:用户回答该题花费的时间(单位:分钟)
示例数据
| user_id | question_id | user_answer | correct_answer | correct | elapsed_time |
|---|---|---|---|---|---|
| 1 | 130 | A | B | 0.0 | 2.00 |
| 1 | 130 | B | B | 1.0 | 5.00 |
| 1 | 130 | B | B | 1.0 | 2.00 |
| 2 | 10 | C | D | 0.0 | 7.00 |
| 2 | 10 | A | D | 0.0 | 9.00 |
| 2 | 10 | B | D | 0.0 | 13.00 |
| 2 | 10 | D | D | 1.0 | 4.00 |
| 2 | 10 | D | D | 1.0 | 1.50 |
目标DataFrame结构
| user_id | Questions Attempted | Unique Questions Attempted | Percentage |
|---|---|---|---|
| 1 | 9000 | 6000 | =(6000/13169)*100 |
| 2 | 5000 | 4800 | =(5000/13169)*100 |
| 5 | 12000 | 10000 | =(10000/13169)*100 |
| 15 | 1000 | 30 | =(30/13169)*100 |
| 23 | 255 | 255 | =(255/13169)*100 |
已完成代码
df_total_questions_attempted = df.groupby(['user_id'], as_index=False , sort=False)['question_id'].count() df_total_questions_attempted = df_total_questions_attempted.rename(columns={'question_id': 'Total Questions Attempted'})
问题需求
咱们已经搞定了「Questions Attempted」列,现在需要获取「Unique Questions Attempted」列——这个列要统计用户首次答对某道题的记录数,也就是每个用户的每个question_id只算第一次答对的那次,之后重复答对同一题的不算。比如示例里用户1第一次答对130题是第2条记录,用户2第一次答对10题是第6条,这两个才会被计入统计。
解决方案
要实现这个需求,咱们可以分几步来做:
- 筛选答对的记录:首先把所有
correct == 1.0的行挑出来,毕竟我们只关注答对的情况。 - 保留首次答对的记录:按
user_id和question_id分组,取每组的第一条数据——这就是该用户第一次答对这道题的记录。 - 统计独特答对题目数:再按
user_id分组,统计每组的记录数量,就是「Unique Questions Attempted」的值。
对应的代码如下:
# 筛选所有答对的记录,然后按用户+题目分组,保留每组第一条(首次答对) df_first_correct = df[df['correct'] == 1.0].groupby(['user_id', 'question_id'], as_index=False, sort=False).first() # 统计每个用户首次答对的独特题目数量 df_unique_attempted = df_first_correct.groupby(['user_id'], as_index=False, sort=False)['question_id'].count() df_unique_attempted = df_unique_attempted.rename(columns={'question_id': 'Unique Questions Attempted'})
接下来把这个结果和你已经得到的总答题数DataFrame合并:
# 合并两个结果,确保所有用户都被包含(即使没有答对任何题的用户) df_final = pd.merge(df_total_questions_attempted, df_unique_attempted, on='user_id', how='left') # 处理空值:如果用户没有答对任何题,Unique Questions Attempted设为0 df_final['Unique Questions Attempted'] = df_final['Unique Questions Attempted'].fillna(0).astype(int)
最后计算百分比列(假设总题数是13169):
total_questions = 13169 # 如果要计算实际百分比数值: df_final['Percentage'] = (df_final['Unique Questions Attempted'] / total_questions) * 100 # 如果要保留Excel公式样式: # df_final['Percentage'] = df_final['Unique Questions Attempted'].apply(lambda x: f'=({x}/{total_questions})*100')
这样就能得到完全符合要求的目标DataFrame啦。
内容的提问来源于stack exchange,提问作者Haseeb Sultan
相关产品推荐
相关产品推荐

