随着时间的推移,我有一个“Perf”数据框,其中包含人员绩效数据。 索引是timstamp,列是人名。 有100个人(列),每个人属于10个组中的一个,但是组分配是动态的,每天每个人可以分配到不同的组。 因此,存在与“Perf”形状相同的第二个“Group”DataFrame,其中包含每个时间戳和人的组号(0-9)。
问题是我怎样才能优雅地为每个人做一个关于小组作业的平均减法? 一种非常慢的方法是:
for g in range(10):
Perf[Group==g] -= Perf[Group==g].mean(1)
但这真的很慢,我确信有一种方法可以一次性完成Pandas。
这是一个具体的例子:
分数代表每个人(0-4)10天(0-9)的分数:
在[8]中:perf = DataFrame(np.random.randn(10,5))
在[9]中:perf
Out [9]:
0 1 2 3 4
0 0.945575 -0.805883 1.338865 0.420829 -1.074329
1 -1.086116 0.430230 1.296153 0.527612 1.269646
2 0.705276 -1.409828 2.859838 -0.769508 1.520295
3 0.331860 -0.217884 0.962576 -0.495888 -1.083996
4 0.402625 0.018885 -0.260516 -0.547802 -0.995959
5 2.168944 -0.361657 0.184537 0.391014 0.972161
6 1.959699 0.590739 -0.781736 1.059761 1.080997
7 2.090273 -2.446399 0.553785 0.806368 -0.786343
8 0.441160 -2.320302 -1.981387 2.190607 0.345626
9 -0.276013 -1.319214 1.339096 0.269680 -0.509884
然后我有一些分组数据框,每天显示5个人中每个人的群组关联,分组每天都在变化。
In [20]: grouping
Out[20]:
0 1 2 3 4
0 3 1 2 1 2
1 3 1 2 2 1
2 2 2 3 1 1
3 1 2 2 3 1
4 3 2 1 2 1
5 2 1 1 2 3
6 1 2 1 2 3
7 2 2 1 1 3
8 2 1 2 1 3
9 1 3 2 1 2
我想修改Perf,以便每天为每个人减去其组的平均分数。
例如第0天它将是0.0 -0.613356 1.206597 0.613356 -1.206597
我想在一行中没有循环。 Groupby似乎是要使用的函数,但是我无法有效地使用它的输出来对原始矩阵执行平均减法运算。