根据组聚合值在 MultiIndex Dataframe 上设置值

Set Values on MultiIndex Dataframe based on Group aggregate value

我有一个 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

本质上是在 C 索引处计算 E 的数量。我想做的是根据聚合结果将原始数据框中的 E 值设置为任意值。例如,如果聚合 >= 某个值,则将组 (C) 的所有 E 设置为 0。

在这种情况下,由于 C0E 总数为 6,我想将任何 C*E 设置为零,其中总和是 >=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

我能够使用下面的代码做到这一点,但它不可扩展,我相信一定有更好的方法来做到这一点:

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

我认为你可以使用 transform for creating boolean mask and then 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