不允许合并超过一层的重叠
Merging with more than one level overlap not allowed
因此,我正在使用 pandas 并且基本上是在尝试计算归一化权重。对于我的数据框中的每一天,我希望 'SECTOR' 权重按 'CAP' 分组,但它们总和不会为 1,因此我也想对它们进行归一化。我以为我可以通过划分两个 groupby 来完成此操作,但是我的代码出现了一个我不太理解的错误。如果我消除第二个groupby中的'CAP',代码可以运行。
谁能给我解释一下?
df.groupby(['EFFECTIVE DATE','CAP','SECTOR'])['INDEX WEIGHT'].sum() / df.groupby(['EFFECTIVE DATE','CAP'])['INDEX WEIGHT'].sum()
NotImplementedError: merging with more than one level overlap on a multi-index is not implemented
有人知道我需要更改什么吗?一如既往的谢谢!!!
选项 1
非常接近你所拥有的
cols = ['EFFECTIVE DATE', 'CAP', 'SECTOR', 'INDEX WEIGHT']
sector_sum = df.groupby(cols[:3])[cols[-1]].sum()
cap_sum = df.groupby(cols[:2])[cols[-1]].transform(pd.Series.sum).values
sector_sum / cap_sum
选项 2
使用单个 transform
cols = ['EFFECTIVE DATE', 'CAP', 'SECTOR', 'INDEX WEIGHT']
sumto = lambda x: x / x.sum()
df.groupby(cols[:3])[cols[-1]].sum().groupby(level=cols[:2]).transform(sumto)
如果您考虑 df
df = pd.DataFrame([
[0, 'Large', 'A', .1, 'a'],
[0, 'Large', 'B', .2, 'b'],
[0, 'Large', 'C', .1, 'c'],
[0, 'Large', 'D', .3, 'd'],
[0, 'Large', 'E', .1, 'e'],
[0, 'Large', 'F', .4, 'f'],
[0, 'Large', 'G', .1, 'g'],
[0, 'Small', 'A', .2, 'h'],
[0, 'Small', 'B', .3, 'i'],
[0, 'Small', 'C', .4, 'j'],
[0, 'Small', 'D', .5, 'k'],
[0, 'Small', 'E', .1, 'l'],
[0, 'Small', 'F', .2, 'm'],
[0, 'Small', 'G', .1, 'n'],
[1, 'Large', 'A', .1, 'a'],
[1, 'Large', 'B', .2, 'b'],
[1, 'Large', 'C', .1, 'c'],
[1, 'Large', 'D', .3, 'd'],
[1, 'Large', 'E', .1, 'e'],
[1, 'Large', 'F', .4, 'f'],
[1, 'Large', 'G', .1, 'g'],
[1, 'Small', 'A', .2, 'h'],
[1, 'Small', 'B', .3, 'i'],
[1, 'Small', 'C', .4, 'j'],
[1, 'Small', 'D', .5, 'k'],
[1, 'Small', 'E', .1, 'l'],
[1, 'Small', 'F', .2, 'm'],
[1, 'Small', 'G', .1, 'n'],
], columns=['EFFECTIVE DATE', 'CAP', 'SECTOR', 'INDEX WEIGHT', 'ID'])
两种选择都产生
EFFECTIVE DATE CAP SECTOR
0 Large A 0.076923
B 0.153846
C 0.076923
D 0.230769
E 0.076923
F 0.307692
G 0.076923
Small A 0.111111
B 0.166667
C 0.222222
D 0.277778
E 0.055556
F 0.111111
G 0.055556
1 Large A 0.076923
B 0.153846
C 0.076923
D 0.230769
E 0.076923
F 0.307692
G 0.076923
Small A 0.111111
B 0.166667
C 0.222222
D 0.277778
E 0.055556
F 0.111111
G 0.055556
Name: INDEX WEIGHT, dtype: float64
如果您将其中一个选项分配给 df1
,则对子组求和
df1.groupby(level=['EFFECTIVE DATE', 'CAP']).sum()
EFFECTIVE DATE CAP
0 Large 1.0
Small 1.0
1 Large 1.0
Small 1.0
Name: INDEX WEIGHT, dtype: float64
时机
因此,我正在使用 pandas 并且基本上是在尝试计算归一化权重。对于我的数据框中的每一天,我希望 'SECTOR' 权重按 'CAP' 分组,但它们总和不会为 1,因此我也想对它们进行归一化。我以为我可以通过划分两个 groupby 来完成此操作,但是我的代码出现了一个我不太理解的错误。如果我消除第二个groupby中的'CAP',代码可以运行。
谁能给我解释一下?
df.groupby(['EFFECTIVE DATE','CAP','SECTOR'])['INDEX WEIGHT'].sum() / df.groupby(['EFFECTIVE DATE','CAP'])['INDEX WEIGHT'].sum()
NotImplementedError: merging with more than one level overlap on a multi-index is not implemented
有人知道我需要更改什么吗?一如既往的谢谢!!!
选项 1
非常接近你所拥有的
cols = ['EFFECTIVE DATE', 'CAP', 'SECTOR', 'INDEX WEIGHT']
sector_sum = df.groupby(cols[:3])[cols[-1]].sum()
cap_sum = df.groupby(cols[:2])[cols[-1]].transform(pd.Series.sum).values
sector_sum / cap_sum
选项 2
使用单个 transform
cols = ['EFFECTIVE DATE', 'CAP', 'SECTOR', 'INDEX WEIGHT']
sumto = lambda x: x / x.sum()
df.groupby(cols[:3])[cols[-1]].sum().groupby(level=cols[:2]).transform(sumto)
如果您考虑 df
df = pd.DataFrame([
[0, 'Large', 'A', .1, 'a'],
[0, 'Large', 'B', .2, 'b'],
[0, 'Large', 'C', .1, 'c'],
[0, 'Large', 'D', .3, 'd'],
[0, 'Large', 'E', .1, 'e'],
[0, 'Large', 'F', .4, 'f'],
[0, 'Large', 'G', .1, 'g'],
[0, 'Small', 'A', .2, 'h'],
[0, 'Small', 'B', .3, 'i'],
[0, 'Small', 'C', .4, 'j'],
[0, 'Small', 'D', .5, 'k'],
[0, 'Small', 'E', .1, 'l'],
[0, 'Small', 'F', .2, 'm'],
[0, 'Small', 'G', .1, 'n'],
[1, 'Large', 'A', .1, 'a'],
[1, 'Large', 'B', .2, 'b'],
[1, 'Large', 'C', .1, 'c'],
[1, 'Large', 'D', .3, 'd'],
[1, 'Large', 'E', .1, 'e'],
[1, 'Large', 'F', .4, 'f'],
[1, 'Large', 'G', .1, 'g'],
[1, 'Small', 'A', .2, 'h'],
[1, 'Small', 'B', .3, 'i'],
[1, 'Small', 'C', .4, 'j'],
[1, 'Small', 'D', .5, 'k'],
[1, 'Small', 'E', .1, 'l'],
[1, 'Small', 'F', .2, 'm'],
[1, 'Small', 'G', .1, 'n'],
], columns=['EFFECTIVE DATE', 'CAP', 'SECTOR', 'INDEX WEIGHT', 'ID'])
两种选择都产生
EFFECTIVE DATE CAP SECTOR
0 Large A 0.076923
B 0.153846
C 0.076923
D 0.230769
E 0.076923
F 0.307692
G 0.076923
Small A 0.111111
B 0.166667
C 0.222222
D 0.277778
E 0.055556
F 0.111111
G 0.055556
1 Large A 0.076923
B 0.153846
C 0.076923
D 0.230769
E 0.076923
F 0.307692
G 0.076923
Small A 0.111111
B 0.166667
C 0.222222
D 0.277778
E 0.055556
F 0.111111
G 0.055556
Name: INDEX WEIGHT, dtype: float64
如果您将其中一个选项分配给 df1
,则对子组求和
df1.groupby(level=['EFFECTIVE DATE', 'CAP']).sum()
EFFECTIVE DATE CAP
0 Large 1.0
Small 1.0
1 Large 1.0
Small 1.0
Name: INDEX WEIGHT, dtype: float64