为什么Nunique会覆盖熊猫中的分组列

时间:2019-07-15 16:30:23

标签: pandas

这是我的数据的简化版本

+---+---------+-----------+
|   | 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?

3 个答案:

答案 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)

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.SeriesGroupBy.nunique.html

这说明了nunique()的确切用法,对于您的情况,它将返回每列中组中唯一元素的数量。