跨多指标的二进制操作广播

时间:2013-12-04 19:17:26

标签: pandas

任何人都可以解释为什么跨多指数系列的广播不起作用?可能是熊猫中的一个错误(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对匹配/广播行为的描述,我希望能够将xy相乘,并在每个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主题的变体。)

1 个答案:

答案 0 :(得分:3)

正如我和@jreback在the issue opened to deal with this中所讨论的,该问题的一个很好的解决方法涉及执行以下操作:

  1. 使用unstack
  2. 将不匹配的索引级别移动到列
  3. 执行乘法/除法
  4. 使用stack
  5. 返回不匹配的索引级别
  6. 确保索引级别与之前的顺序相同。
  7. 以下是它的工作原理:

    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
    

    我觉得这很好,应该非常有效率。