首页 > 解决方案 > 使用 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

标签: pythonpandasdataframepandas-groupbyseries

解决方案


使用命名聚合,因为函数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

编辑:对于较旧的熊猫版本,请reset_index改用as_index=False

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

推荐阅读