根据组聚合值在 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。
在这种情况下,由于 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
我认为你可以使用 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
我有一个 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
我认为你可以使用 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