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

时间:2016-02-28 03:47:20

标签: python pandas dataframe multi-index

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

根据E列汇总C列后,我得到以下内容:

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

       E
S C     
0 C0   6
  C1  10
  C2  14

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

在这种情况下,因为E的{​​{1}}总数为6,我想将C0设为零,其中EC*,其中总和为> ; = 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

1 个答案:

答案 0 :(得分:1)

我认为您可以使用transform创建布尔掩码,然后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