Python 一列中每个值在另一列中的项数
我有两个数据帧。例如,第1帧是学生信息:Python 一列中每个值在另一列中的项数,python,pandas,Python,Pandas,我有两个数据帧。例如,第1帧是学生信息: student_id course 1 a 2 b 3 c 4 a 5 f 6 f 框架2是学生与课程的每次互动 student_id day number_of_clicks 1 4 60 1 5 34 1 7 87 2 3 33 2
student_id course
1 a
2 b
3 c
4 a
5 f
6 f
框架2是学生与课程的每次互动
student_id day number_of_clicks
1 4 60
1 5 34
1 7 87
2 3 33
2 4 29
2 8 213
2 9 46
3 2 103
我试图将第2帧中的信息添加到第1帧中,也就是说,对于每个学生,我想知道他们访问数据库的不同天数,以及这些日子中所有点击次数的总和。例如:
student_id course no_days total_clicks
1 a 3 181
2 b 4 321
3 c 1 103
4 a 0 0
5 f 0 0
6 f 0 0
我曾尝试使用groupby进行此操作,但我无法将信息添加回第1帧,也无法计算单击次数的总和。有什么想法吗?首先,我们使用
GroupBy.agg
将您的df2
聚合到所需的信息。然后我们将该信息合并到df1中:
agg = df2.groupby('student_id').agg(
no_days=('day', 'size'),
total_clicks=('number_of_clicks', 'sum')
)
df1 = df1.merge(agg, on='student_id', how='left').fillna(0)
student_id course no_days total_clicks
0 1 a 3.0 181.0
1 2 b 4.0 321.0
2 3 c 1.0 103.0
3 4 a 0.0 0.0
4 5 f 0.0 0.0
5 6 f 0.0 0.0
或者,如果您喜欢单行程序,这里有与上面相同的方法,但是在
SQL
中有一行代码和更多代码:
df1.merge(
df2.groupby('student_id').agg(
no_days=('day', 'size'),
total_clicks=('number_of_clicks', 'sum')
),
on='student_id',
how='left'
).fillna(0)
使用,然后将空值聚合为:
df = df1.merge(df2, how='left').fillna(0, downcast='infer')\
.groupby(['student_id', 'course'], as_index=False)\
.agg({'day':np.count_nonzero, 'number_of_clicks':np.sum}).reset_index()
print(df)
student_id course day number_of_clicks
0 1 a 3 181
1 2 b 4 321
2 3 c 1 103
3 4 a 0 0
4 5 f 0 0
5 6 f 0 0