我有一个 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,我想将 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
我能够使用下面的代码做到这一点,但它不可扩展,我相信一定有更好的方法来做到这一点:
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
用于创建 bool 掩码,然后是 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
关于python - 根据组聚合值在 MultiIndex Dataframe 上设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35678458/