You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中统计用户首次答对的唯一题目数量并生成统计报表

解决Pandas中统计用户首次答对题目数量的问题

现有DataFrame结构

  • user_id:代表用户ID
  • question_id:代表题目编号
  • user_answer:用户针对该题选择的选项(可选值为A、B、C、D)
  • correct_answer:该题的正确答案
  • correct:标记用户答案是否正确,0.0表示错误,1.0表示正确
  • elapsed_time:用户回答该题花费的时间(单位:分钟)

示例数据

user_idquestion_iduser_answercorrect_answercorrectelapsed_time
1130AB0.02.00
1130BB1.05.00
1130BB1.02.00
210CD0.07.00
210AD0.09.00
210BD0.013.00
210DD1.04.00
210DD1.01.50

目标DataFrame结构

user_idQuestions AttemptedUnique Questions AttemptedPercentage
190006000=(6000/13169)*100
250004800=(5000/13169)*100
51200010000=(10000/13169)*100
15100030=(30/13169)*100
23255255=(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条,这两个才会被计入统计。

解决方案

要实现这个需求,咱们可以分几步来做:

  1. 筛选答对的记录:首先把所有correct == 1.0的行挑出来,毕竟我们只关注答对的情况。
  2. 保留首次答对的记录:按user_id和question_id分组,取每组的第一条数据——这就是该用户第一次答对这道题的记录。
  3. 统计独特答对题目数:再按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:53:13