【问题标题】:Group by one column and find the no. of unique values in the other column按一列分组并找到编号。另一列中的唯一值
【发布时间】:2019-12-07 03:44:14
【问题描述】:

我有一个如下的数据框,

         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

我想计算每小时唯一员工的平均值,如下所示

小时     unique_staff
6            2
7            3

说明:
在第 6 点,
Unique_staff= 2
10 月 1 日:3(A、B、C)+ 10 月 2 日:3(D、B、A)+ 10 月 3 日:1(B)= 3+3+1=7/3(唯一日期数)~2

7点,
Unique_staff= 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,不是吗?

标签: python pandas dataframe pandas-groupby


【解决方案1】:
df.groupby(['hour', 'date'])['staff'].nunique().reset_index()\
  .groupby('hour')['staff'].mean().round()

>>> output

6   2.0
7   3.0

编辑:

anky_91 在 cmets 中的解决方案要快得多,绝对应该使用:

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

【讨论】:

  • 啊我的太相似了..让我删除,还有一种方法是df.groupby(['date','hour'])['staff'].nunique().mean(level=1).round()
  • @anky_91,不错的解决方案,应该发布它
  • @BrianJoseph 与您的没有太大区别,请随时将其添加到您的解决方案中 :)
  • @anky_91 我的是 df.groupby(['date', 'hour']).nunique().unstack().agg('mean')['staff'].round()你赢了几个字节。删除我的
猜你喜欢
  • 1970-01-01
  • 2017-12-08
  • 2021-02-10
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多