【问题标题】:Set Values on MultiIndex Dataframe based on Group aggregate value根据组聚合值在 MultiIndex Dataframe 上设置值
【发布时间】:2016-02-28 03:47:19
【问题描述】:

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

在这种情况下,由于 C0 的 E 总数为 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

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案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
    

    【讨论】:

    • 这确实做到了。我对有效的转换模式没有很好的理解,因为我相信它返回与原始数据框相同的索引。谢谢。
    猜你喜欢
    • 2020-06-15
    • 2022-08-03
    • 2020-06-23
    • 2022-12-04
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2018-12-18
    • 2014-11-13
    相关资源
    最近更新 更多