我有一个如下数据框,
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
我想计算每小时唯一员工的平均值,如下所示
小时
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
答案 0 :(得分:2)
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()
答案 1 :(得分:0)
我没有足够的声誉来发表评论-第一个解决方案中第二次包含['staff']
是虚假的。将reset_index()放在末尾也稍微好一点。
df.groupby(['date','hour'])['staff'].nunique().groupby('hour').mean().round().reset_index()
使用agg的替代语法:
df.groupby(['date','hour']).agg(lambda x: x.nunique()).groupby('hour').mean().round() \
.reset_index()
如果您确实希望将结果作为整数,则可以将mean()
替换为astype(int)
:
df.groupby(['date','hour'])['staff'].nunique().mean(level=1).astype(int).reset_index()