2016-02-28 71 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