Ответ 1
Там открытая ошибка для этой проблемы, а текущая веха говорит 0.15.1
.
До тех пор, пока не появится что-то приятное, обходной путь, включающий следующие шаги:
- получить несоответствующий индексный уровень из пути
unstack
в столбцы - выполнить операцию умножения/деления
-
stack
столбцы вернулись туда, где они были.
Вот так:
In [109]: dfa.unstack('c').mul(dfb.squeeze(), axis=0).stack('c')
Out[109]:
d
a b c
a a10 0 1.535221
1 -2.151894
2 1.986061
3 -1.946031
4 -4.868800
a20 5 -2.278917
6 -1.535684
7 2.289102
8 -0.442284
9 -0.547209
b a30 10 -12.568426
11 7.180348
12 1.584510
13 3.419332
14 -3.011810
a40 15 -0.367091
16 4.264955
17 2.410733
18 0.030926
19 1.219653
c a50 20 0.110586
21 -0.430263
22 0.350308
23 1.101523
24 -1.371180
a60 25 -0.003683
26 0.069884
27 0.206635
28 0.356708
29 0.111380
Обратите внимание на две вещи:
-
dfb
должен бытьSeries
, в противном случае существует дополнительное усложнение о том, какие столбцыdfb
использовать для умножения. Вы можете заменитьdfb.squeeze()
наdfb['m']
. - Если индекс несоответствия не был уже последним из трех, порядок уровней индекса не сохранился. В этом случае сделайте то, что предлагает @jreback, и измените порядок уровней индекса:
.reorder_levels(dfa.index.names)