Pandas DataFrame动态子组操作

时间:2015-08-18 10:59:53

标签: python pandas

随着时间的推移,我有一个“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似乎是要使用的函数,但是我无法有效地使用它的输出来对原始矩阵执行平均减法运算。

0 个答案:

没有答案