python - 使用 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
编辑:对于较旧的熊猫版本,请reset_index
改用as_index=False
:
df1 = df.groupby('ID').agg(s_cnt = ('subject_id', 'nunique'),
r_cnt= ('subject_id', 'size')).reset_index()
推荐阅读
- vb.net - 使用VB隐藏DataGridView中的所有行
- sql - 更新语句不适用于循环
- codenameone - PropertyIndex.storeJSON("UserDB") 按 Properties 的相同顺序或字母顺序
- c# - 如何将 Azure Application Insights 限制为仅记录 dotnet 核心项目中的自定义事件?
- angular - 这是什么意思 []?
- python - 如何将数据框中的连接值插入 Pyspark 中的另一个数据框中?
- java - 这是按 Java 集合中的键排序的最有效方法吗?
- php - 验证一个类别是否已经存在,如果存在 save() 如果不存在 add() PrestaShop
- hadoop - 断电重启hadoop HA集群节点后name节点失效
- c# - 如何在单个结构中存储不同类型的值