Python 按一列分组,并在另一列中查找唯一值的数目

Python 按一列分组,并在另一列中查找唯一值的数目,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据框,如下所示 date hour staff 0 2019-10-01 6 A 1 2019-10-01 6 B 2 2019-10-01 6 C 3 2019-10-02 6 D 4 2019-10-02 6 B 5 2019-10-02 6 A 6 2019-10-03 6 B 7 2019-10-03 6 B 8

我有一个数据框,如下所示

         date  hour staff
0  2019-10-01     6     A
1  2019-10-01     6     B
2  2019-10-01     6     C
3  2019-10-02     6     D
4  2019-10-02     6     B
5  2019-10-02     6     A
6  2019-10-03     6     B
7  2019-10-03     6     B
8  2019-10-03     6     B
9  2019-10-01     7     D
10 2019-10-01     7     A
11 2019-10-01     7     B
12 2019-10-01     7     C
13 2019-10-02     7     D
14 2019-10-02     7     C
15 2019-10-02     7     A
16 2019-10-03     7     B
17 2019-10-03     7     B
18 2019-10-03     7     A
我想计算每小时唯一员工的平均值,如下所示

工作人员的小时数
62
73

说明:
在第6小时,
唯一的工作人员=2
10月1日:3(A,B,C)+10月2日:3(D,B,A)+10月3日:1(B)=3+3+1=7/3(唯一日期的数量)~2

在第7小时,
唯一的工作人员=3
10月1日:4(D,A,B,C)+10月2日:3(D,C,A)+10月3日:2(B,A)=4+3+2=9/3(唯一日期的数量)~3

df.groupby(['hour', 'date'])['staff'].nunique().reset_index()\
  .groupby('hour')['staff'].mean().round()

>>> output

6   2.0
7   3.0
编辑:

anky_91在评论中提出的解决方案速度快得多,绝对应该使用:

df.groupby(['date','hour'])['staff'].nunique().mean(level=1).round()

看起来您的预期输出是错误的。指数7的值应该是3,不是吗?啊,我的太相似了。。让我删除,还有一种方法是
df.groupby(['date','hour'])['staff'].nunique().mean(level=1).round()
@anky_91,很好的解决方案,应该发布it@BrianJoseph它与您的没有太大区别,请随意添加到您的解决方案中:)@anky_91我的是df.groupby(['date','hour']).nunique().unstack().agg('mean')['staff'].round()你赢了几个字节。删除的地雷