我有一个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
设为零,其中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
答案 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