检查 pandas 用户 ID 交互数据框中的唯一条目
Checking unique enteries in pandas dataframe of user id interactions
我有这样的数据框:
user_id : 代表用户
question_id : 代表题号
user_answer : 用户从 (A,B,C,D)
中选择了哪个选项
correct_answer:该特定问题的正确答案是什么
正确 : 如果 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
我希望另一个数据框看起来像这样
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'})
这给了我尝试过的问题列,如何找到尝试过的独特问题列?
对于尝试过的独特问题列,当用户更正答案时,我需要该独特条目。
例如:
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
D
D
1.0
4.00
2
10
D
D
1.0
1.50
在此数据框中:当用户第一次更正问题时,应考虑独特的问题尝试,如本例所示
用户 1 已在第 2 次和第 3 次尝试中更正了问题。它应该考虑第二次尝试。
用户 2 也一样,用户 2 在第 3 次和第 4 次尝试中更正了问题,应该考虑 第 3 次尝试
通过 Series.eq
with DataFrame.duplicated
:
的链掩码 ==
为每个 user_id
和 question_id
的第一个正确答案创建辅助列
df['new'] = df['correct'].eq(1) & ~df.duplicated(['user_id','question_id','correct'])
print (df)
user_id question_id user_answer correct_answer correct elapsed_time \
0 1 130 A B 0.0 2.0
1 1 130 B B 1.0 5.0
2 1 130 B B 1.0 2.0
3 2 10 C D 0.0 7.0
4 2 10 A D 0.0 9.0
5 2 10 B D 0.0 13.0
6 2 10 D D 1.0 4.0
7 2 10 D D 1.0 1.5
new
0 False
1 True
2 False
3 False
4 False
5 False
6 True
7 False
然后对于计数 True
s 聚合 sum
和对于唯一计数 questions
使用 DataFrameGroupBy.nunique
:
df1 = (df.groupby(['user_id'])
.agg(**{'Questions Attempted':('question_id','nunique'),
'Unique Questions Attempted':('new','sum')})
.reset_index())
最后似乎百分比是必要的除以独特问题的数量:
no_uniq_q = df['correct'].nunique()
df1['Percentage'] = df1['Unique Questions Attempted'].div(no_uniq_q).mul(100)
print (df1)
user_id Questions Attempted Unique Questions Attempted Percentage
0 1 1 1 50.0
1 2 1 1 50.0
我有这样的数据框:
user_id : 代表用户
question_id : 代表题号
user_answer : 用户从 (A,B,C,D)
中选择了哪个选项correct_answer:该特定问题的正确答案是什么
正确 : 如果 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 |
我希望另一个数据框看起来像这样
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'})
这给了我尝试过的问题列,如何找到尝试过的独特问题列?
对于尝试过的独特问题列,当用户更正答案时,我需要该独特条目。
例如:
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 | D | D | 1.0 | 4.00 |
2 | 10 | D | D | 1.0 | 1.50 |
在此数据框中:当用户第一次更正问题时,应考虑独特的问题尝试,如本例所示 用户 1 已在第 2 次和第 3 次尝试中更正了问题。它应该考虑第二次尝试。 用户 2 也一样,用户 2 在第 3 次和第 4 次尝试中更正了问题,应该考虑 第 3 次尝试
通过 Series.eq
with DataFrame.duplicated
:
==
为每个 user_id
和 question_id
的第一个正确答案创建辅助列
df['new'] = df['correct'].eq(1) & ~df.duplicated(['user_id','question_id','correct'])
print (df)
user_id question_id user_answer correct_answer correct elapsed_time \
0 1 130 A B 0.0 2.0
1 1 130 B B 1.0 5.0
2 1 130 B B 1.0 2.0
3 2 10 C D 0.0 7.0
4 2 10 A D 0.0 9.0
5 2 10 B D 0.0 13.0
6 2 10 D D 1.0 4.0
7 2 10 D D 1.0 1.5
new
0 False
1 True
2 False
3 False
4 False
5 False
6 True
7 False
然后对于计数 True
s 聚合 sum
和对于唯一计数 questions
使用 DataFrameGroupBy.nunique
:
df1 = (df.groupby(['user_id'])
.agg(**{'Questions Attempted':('question_id','nunique'),
'Unique Questions Attempted':('new','sum')})
.reset_index())
最后似乎百分比是必要的除以独特问题的数量:
no_uniq_q = df['correct'].nunique()
df1['Percentage'] = df1['Unique Questions Attempted'].div(no_uniq_q).mul(100)
print (df1)
user_id Questions Attempted Unique Questions Attempted Percentage
0 1 1 1 50.0
1 2 1 1 50.0