2013-07-04 66 views
4

我想乘兩個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 

的問題是,我不能從2到3的水平重新索引Series

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 

但我認爲有肩膀d只需要1步即可完成此操作。

回答

1

試試這個。 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 
+0

謝謝,我測試了我的實際數據集(幾百萬次採樣),復位指數是快,但乘法是很慢的,我猜是因爲匹配指數是慢。有沒有更高效的選擇? –

+0

肯定只是乘數組本身並設置索引之後;但您必須確保數據大小相同。你在這裏的目標是什麼? – Jeff

+0

數組大小不一樣,就像本例中一樣。第一個數組有3個級別,第二個數組只有前2個,我想將它們乘以匹配的索引。 –

1

有一個解決方法,直到通過各種增強請求「好」的解決方案。

你可以簡單:

  • unstack有問題的指數水平(S)的距離
  • 做乘法
  • stack有問題的指數水平(S)回來了。

像這樣:

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