Multiplica dos series con MultiIndex en pandas.

Estoy tratando de multiplicar dos Series , ambas con MultiIndex :

 import pandas as pd tuples = [(0, 100, 1000),(0, 100, 1001),(0, 100, 1002), (1, 101, 1001)] index_3levels=pd.MultiIndex.from_tuples(tuples,names=["l1","l2","l3"]) tuples = [(0, 100), (1, 101)] index_2levels=pd.MultiIndex.from_tuples(tuples,names=["l1","l2"]) data_3levels = pd.Series(1, index=index_3levels) data_2levels = pd.Series([2,3], index=index_2levels) print data_3levels l1 l2 l3 0 100 1000 1 1001 1 1002 1 1 101 1001 1 dtype: int64 print data_2levels l1 l2 0 100 2 1 101 3 dtype: int64 

El problema es que no puedo reindexar la Series de 2 a 3 niveles:

 data_2levels.reindex(data_3levels.index, level=["l1","l2"]) Exception: Join on level between two MultiIndex objects is ambiguous 

He encontrado esta solución:

 for l1 in [0,1]: data_3levels[l1] *= data_2levels[l1].reindex(data_3levels[l1].index, level="l2") print data_3levels l1 l2 l3 0 100 1000 2 1001 2 1002 2 1 101 1001 3 dtype: int64 

Pero creo que debería haber un método para realizar esta operación en solo 1 paso.

Prueba esto. reset_index elimina el último nivel, por lo que son los mismos cuando se multiplica

 In [25]: x = data_3levels.reset_index(level=2,drop=True)*data_2levels 

Ya que quieres el índice original (y la forma no ha cambiado), esto funciona.

 In [26]: x.index=data_3levels.index In [27]: x Out[27]: l1 l2 l3 0 100 1000 2 1001 2 1002 2 1 101 1001 3 dtype: int64 

Hay una solución a esto hasta que se obtiene una solución “agradable” a través de varias solicitudes de mejora.

Usted puede simplemente:

  • unstack los niveles de índice problemático de distancia
  • hacer la multiplicación
  • stack los niveles de índice problemático de nuevo.

Me gusta esto:

 In [92]: data_3levels.unstack('l3').mul(data_2levels, axis=0).stack() Out[92]: l1 l2 l3 0 100 1000 2 1001 2 1002 2 1 101 1001 3 dtype: float64