任何人都可以解释为什么跨多指数系列的广播不起作用?可能是熊猫中的一个错误(0.12.0)?
x = pd.DataFrame({'year':[1,1,1,1,2,2,2,2],
'country':['A','A','B','B','A','A','B','B'],
'prod':[1,2,1,2,1,2,1,2],
'val':[10,20,15,25,20,30,25,35]})
x = x.set_index(['year','country','prod']).squeeze()
y = pd.DataFrame({'year':[1,1,2,2],'prod':[1,2,1,2],
'mul':[10,0.1,20,0.2]})
y = y.set_index(['year','prod']).squeeze()
根据pandas docs对匹配/广播行为的描述,我希望能够将x
和y
相乘,并在每个y
广播country
,给予:
>>> x.mul(y, level=['year','prod'])
year country prod
1 A 1 100.0
2 2.0
B 1 150.0
2 2.5
2 A 1 400.0
2 6.0
B 1 500.0
2 7.0
但相反,我得到了:
Exception: Join on level between two MultiIndex objects is ambiguous
(请注意,这是this question主题的变体。)
答案 0 :(得分:3)
正如我和@jreback在the issue opened to deal with this中所讨论的,该问题的一个很好的解决方法涉及执行以下操作:
unstack
stack
以下是它的工作原理:
In [112]: x.unstack('country').mul(y, axis=0).stack('country').reorder_levels(x.index.names)
Out[112]:
year country prod
1 A 1 100.0
B 1 150.0
A 2 2.0
B 2 2.5
2 A 1 400.0
B 1 500.0
A 2 6.0
B 2 7.0
dtype: float64
我觉得这很好,应该非常有效率。