Умножьте две серии с MultiIndex в пандах

Я пытаюсь умножить две Series , как с 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 

Проблема в том, что я не могу переопределить Series от 2 до 3 уровней:

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

Я нашел это решение:

 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 

Но я думаю, что должен быть способ выполнить эту операцию всего за 1 шаг.

2 Solutions collect form web for “Умножьте две серии с MultiIndex в пандах”

Попробуй это. reset_index удаляет последний уровень, поэтому они одинаковы при умножении

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

Поскольку вы хотите, чтобы исходный индекс (и форма не изменилась), это работает.

 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 

Обходной путь к нему до тех пор, пока «приятное» решение не возникнет через различные запросы расширения.

Вы можете просто:

  • unstack уровень проблемных индексов
  • сделать умножение
  • stack проблемный уровень (ы) индекса.

Как это:

 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 
Python - лучший язык программирования в мире.