2016-04-08 50 views
2

如何通過多索引從數據框中獲取值?如何通過使用python熊貓的多指標獲取價值?

比如我有一個數據幀mm

np.random.seed(1) 
mm = pd.DataFrame(np.random.randn(5,2)) 
mm['A'] = np.arange(5) 
mm['B'] = np.arange(5,10) 
mm.set_index(['A','B'], inplace=True) 

print mm 

     0   1 
A B      
0 5 1.624345 -0.611756 
1 6 -0.528172 -1.072969 
2 7 0.865408 -2.301539 
3 8 1.744812 -0.761207 
4 9 0.319039 -0.249370 

我想其中A = 2,B = 7,我該怎麼辦,要獲得價值?

是否可以寫一個函數像get_value(mm, (2,7)),那麼我就可以得到以下結果:

2 7 0.865408 -2.301539 

回答

1

使用mm.loc通過標籤來選擇行:

In [28]: row = mm.loc[2,7]; row 
Out[28]: 
0 0.865408 
1 -2.301539 
Name: (2, 7), dtype: float64 

In [40]: np.concatenate([row.name, row]) 
Out[40]: array([ 2.  , 7.  , 0.86540763, -2.3015387 ]) 

由於mm具有多指標,每行標籤表示爲一個元組(例如(2,7))。當沒有歧義時,如括號內,括號可以被刪除:mm.loc[2, 7]相當於mm.loc[(2, 7)]


要獲得所有行B=7,你可以

  • 使用 pd.IndexSlice

    xs = pd.IndexSlice 
    mm.loc[xs[:, 7], :] 
    
  • mm.query method

    mm.query('B==7') 
    
  • mm.index.get_loc_levelmm.loc

    mask, idx = index.get_loc_level(7, level='B') 
    mm.loc[mask] 
    
  • mm.index.get_loc_levelmm.iloc

    mask, idx = index.get_loc_level(7, level='B') 
    mm.iloc[idx] 
    

上述每個迴歸表達式的數據幀

  0   1 
A B      
2 7 0.865408 -2.301539 
+0

感謝@unutbu ,但是我可能只給出第二個索引嗎?例如,我想選擇所有行,其中B = 7? – xirururu

1

這將返回您的選擇作爲數據幀:

>>> mm.loc[[(2, 7)]] 
      0   1 
A B      
2 7 0.865408 -2.301539 

要獲得指數和值:

>>> mm.loc[[(2, 7)]].reset_index().values.tolist()[0] 
[2.0, 7.0, 0.8654076293246785, -2.3015386968802827] 

要獲得所有值,其中第二項是7:

idx = pd.IndexSlice 
>>> mm.loc[idx[:, 7], :] 
      0   1 
A B      
2 7 0.865408 -2.301539