使用 pandas groupby 获取大小和唯一计数的优雅方式

Elegant way to get size and unique count using pandas groupby

我有一个如下所示的数据框

ID     subject_id
3403       1
3478       1
3478       1
3478       1
3478       1
3478       1
3478       1
3481       1
3481       1
3481       3
3481       3

我想要 size() 以及 no of unique subjects under each ID

所以,我尝试了以下

df['s_cnt'] = df.groupby(['Id']).subject_id.nunique()
df['r_cnt'] = df.groupby(['Id']).size()

有没有办法在一行中完成这两个操作?

任何优雅的方法都会有所帮助,因为我必须将其应用于大数据

我希望我的输出如下所示

 Id   s_cnt   r_cnt
3403    1       1
3478    1       6
3481    2       4

使用命名聚合,因为函数 size 可以传递任何列,例如这里 subject_idID,但对于 nunique 是必要的传递列,用于测试唯一值的数量 - 这里 subject_id:

df1 = df.groupby('ID', as_index=False).agg(s_cnt = ('subject_id', 'nunique'),
                                           r_cnt= ('subject_id', 'size'))

或:

df1 = df.groupby('ID', as_index=False).agg(s_cnt = ('subject_id', 'nunique'),
                                           r_cnt= ('ID', 'size'))

print (df1)
     ID  s_cnt  r_cnt
0  3403      1      1
1  3478      1      6
2  3481      2      4

编辑:对于较旧的 pandas 版本使用 reset_index 而不是 as_index=False:

df1 = df.groupby('ID').agg(s_cnt = ('subject_id', 'nunique'),
                           r_cnt= ('subject_id', 'size')).reset_index()