Python 一列中每个值在另一列中的项数

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

我有两个数据帧。例如,第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          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