2016-02-28 38 views
2

我有一个MultiIndex数据框,看起来像如下:设置值

In [1349]: print simple 

     E 
S C R  
0 C0 R0 0 
    R1 1 
    R2 2 
    R3 3 
    C1 R0 1 
    R1 2 
    R2 3 
    R3 4 
    C2 R0 2 
    R1 3 
    R2 4 
    R3 5 

C列聚集E列后,我得到如下:

In [1352]: print simple.groupby(level=['S','C']).sum() 

     E 
S C  
0 C0 6 
    C1 10 
    C2 14 

基本上计数EC指数的数量。我想要做的是将原始数据帧中的E值设置为任意值,具体取决于聚合结果。例如,如果集合> =某个值,则将所有E设置为0,组(C)

在这种情况下

由于EC0的总数是6,我想的E设置为零任何C*其中总和是> = 6,以显示类似:

In [1349]: print df 

     E 
S C R  
0 C0 R0 0 
    R1 0 
    R2 0 
    R3 0 
    C1 R0 1 
    R1 2 
    R2 3 
    R3 4 
    C2 R0 2 
    R1 3 
    R2 4 
    R3 5 

我能够用下面的代码它做的,但它是不可伸缩的,我相信一定有更好的方法来做到这一点:我认为你可以使用transform创建布尔面具

s3 = (simple.groupby(level=['S','C']).aggregate(sum)< 7) 
s3=s3[s3['E']==True] 
simple_orig = simple.copy() 
for idx in s3.index: 
    simple.ix[idx]= 0 
print simple 
print simple_orig 
      E 
    S C R  
    0 C0 R0 0 
     R1 0 
     R2 0 
     R3 0 
     C1 R0 1 
     R1 2 
     R2 3 
     R3 4 
     C2 R0 2 
     R1 3 
     R2 4 
     R3 5 
      E 
    S C R  
    0 C0 R0 0 
     R1 0 
     R2 0 
     R3 0 
     C1 R0 1 
     R1 2 
     R2 3 
     R3 4 
     C2 R0 2 
     R1 3 
     R2 4 
     R3 5 

回答

1

和然后boolean indexing喜欢:

print simple 
     E 
S C R  
0 C0 R0 0 
    R1 1 
    R2 2 
    R3 3 
    C1 R0 1 
    R1 2 
    R2 3 
    R3 4 
    C2 R0 2 
    R1 3 
    R2 4 
    R3 5 

mask = (simple.groupby(level=['S','C']).transform(sum)< 7)['E'] 
print mask 
S C R 
0 C0 R0  True 
     R1  True 
     R2  True 
     R3  True 
    C1 R0 False 
     R1 False 
     R2 False 
     R3 False 
    C2 R0 False 
     R1 False 
     R2 False 
     R3 False 
Name: E, dtype: bool 
simple.loc[mask, 'E'] = 0 
print simple 
     E 
S C R  
0 C0 R0 0 
    R1 0 
    R2 0 
    R3 0 
    C1 R0 1 
    R1 2 
    R2 3 
    R3 4 
    C2 R0 2 
    R1 3 
    R2 4 
    R3 5 
+0

这的确做到了。我对转换模式没有很好的理解,因为我相信它会返回与原始数据帧相同的索引。谢谢。 – fulatoro