按一列分组并查找另一列中唯一值的数量。

3

我有一个如下的数据框:

         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

我希望计算每小时独立员工的平均数,如下所示
小时 独立员工 6 2 7 3
解释: 在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

看起来你期望的输出是错误的。索引7的值应该是3,不是吗? - Brian
1个回答

4
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()

2
啊,我的代码太相似了...让我删掉它,另一种方法是df.groupby(['date','hour'])['staff'].nunique().mean(level=1).round() - anky
@anky_91,不错的解决方案,应该发布出来。 - Brian
1
@BrianJoseph,它与你的并没有太大的不同,随意将其添加到你的解决方案中 :) - anky
1
@anky_91 我的代码是 df.groupby(['date', 'hour']).nunique().unstack().agg('mean')['staff'].round() 你赢了几个字节。我删除了我的代码。 - oppressionslayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接