pandas - 通过划分 Pandas 中的其他两个子列,在 multiIndex 中创建一个新的子列
问题描述
当我尝试通过将两个数字除以总和 (1+1/3+2+1+1) 来创建新的计算列时出现错误。
错误是:ValueError:不能加入没有重叠的索引名称
这是我目前拥有的:
lvl0 a b
lvl1 bar foo bar foo
lvl2 fake real fake real fake real fake real
A0 B0 C0 D0 2 3 0 1 6 7 4 5
D1 10 11 8 9 14 15 12 13
C1 D0 18 19 16 17 22 23 20 21
D1 26 27 24 25 30 31 28 29
C2 D0 34 35 32 33 38 39 36 37
D1 42 43 40 41 46 47 44 45
C3 D0 50 51 48 49 54 55 52 53
D1 58 59 56 57 62 63 60 61
first = dfmi['a', 'foo', 'fake'] + dfmi['a', 'bar', 'fake']
dfmi = dfmi.loc[:, ('a', 'Fake %', 'Fake Calculation')] = first.div(dfmi.sum(axis=1, level=0), level=0)
您应该能够复制和粘贴以进行测试
# creating MultiIndex
def mklbl(prefix, n):
return ["%s%s" % (prefix, i) for i in range(n)]
miindex = pd.MultiIndex.from_product([mklbl('A', 4),
mklbl('B', 2),
mklbl('C', 4),
mklbl('D', 2)])
micolumns = pd.MultiIndex.from_tuples([('a', 'foo', 'fake'),
('a', 'foo', 'real'),
('a', 'bar', 'fake'),
('a', 'bar', 'real'),
('b', 'foo', 'fake'),
('b', 'foo', 'real'),
('b', 'bar', 'fake'),
('b', 'bar', 'real'),
],
names=['lvl0', 'lvl1', 'lvl2'])
dfmi = pd.DataFrame(np.arange(len(miindex) * len(micolumns))
.reshape((len(miindex), len(micolumns))),
index=miindex,
columns=micolumns).sort_index().sort_index(axis=1)
# My Code
first = dfmi['a', 'foo', 'fake'] + dfmi['a', 'bar', 'fake']
dfmi = dfmi.loc[:, ('a', 'Fake %', 'Fake Calculation')] = first.div(dfmi.sum(axis=1, level=0), level=0)
这就是我想要的样子:
lvl0 a b
lvl1 bar foo bar foo
lvl2 fake real fake real CALCULATE fake real fake real
A0 B0 C0 D0 2 3 0 1 33% 6 7 4 5
D1 10 11 8 9 47% 14 15 12 13
C1 D0 18 19 16 17 ETC 22 23 20 21
D1 26 27 24 25 ETC 30 31 28 29
C2 D0 34 35 32 33 ETC 38 39 36 37
D1 42 43 40 41 ETC 46 47 44 45
C3 D0 50 51 48 49 ETC 54 55 52 53
D1 58 59 56 57 ETC 62 63 60 61
计算列只是 (fake+fake)/(fake+real+fake+real) 在行中。
解决方案
你可以试试
df.sum(level=[0,2],axis=1).loc[:,pd.IndexSlice[:,'fake']].div(df.sum(level=0,axis=1),level=0,axis=0)
推荐阅读
- java - 显示下一个对象 OnClickListener Android Studios
- javascript - 关于带小数的数字的奇怪字符串行为
- vb.net - 从本地目录下载文件?
- javascript - 正则表达式删除除@之外的所有非字母数字
- python - 如何在snakemake中处理可变数量的复制
- amazon-web-services - AppConfig 可以用于跨账户部署吗?
- swift - TabBarController:总是跳转到根 NavigationController
- javascript - @firebase/firestore:Firestore (7.16.0):连接 GRPC 流错误。代码:1 消息:1 CANCELLED:操作已取消
- firebase - .once() 在使用 Flutter 和 Firebase 时似乎不起作用/无法识别
- typescript - 打字稿:第一次编译总是失败,但第二次成功