使用 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_id
或 ID
,但对于 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()
我有一个如下所示的数据框
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_id
或 ID
,但对于 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()