这是我的数据的简化版本
+---+---------+-----------+
| | user_id | module_id |
+---+---------+-----------+
| 0 | 1 | 1 |
| 1 | 1 | 2 |
| 2 | 1 | 3 |
| 3 | 2 | 1 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
+---+---------+-----------+
df = pd.DataFrame({'user_id':[1,1,1,2,2,2],'module_id':[1,2,3,1,1,2]})
如果将其分组在user_id上,然后使用总和进行汇总,则会得到预期的结果:
df.groupby('user_id', as_index=False).sum()
+---+---------+-----------+
| | user_id | module_id |
+---+---------+-----------+
| 0 | 1 | 6 |
| 1 | 2 | 4 |
+---+---------+-----------+
但是,如果我改为使用nunique进行聚合,则分组列也会被聚合:
df.groupby('user_id', as_index=False).nunique()
+---+---------+-----------+
| | user_id | module_id |
+---+---------+-----------+
| 0 | 1 | 3 |
| 1 | 1 | 2 |
+---+---------+-----------+
为什么要将我的聚合函数从sum
更改为nunique
,从而覆盖了groupby列user_id?
答案 0 :(得分:2)
这只是nunqiue
的方式,因为您没有提到要应用该功能的列,所以它将应用于dfs中的每一列,这将为groupby
id <返回1 / p>
df.groupby('user_id')['module_id'].nunique().reset_index()
Out[521]:
user_id module_id
0 1 3
1 2 2
答案 1 :(得分:1)
您需要提供列名
df.groupby('user_id')[['module_id']].nunique().reset_index()
user_id module_id
0 1 3
1 2 2
答案 2 :(得分:0)
这说明了nunique()的确切用法,对于您的情况,它将返回每列中组中唯一元素的数量。