2015-06-03 30 views
3

我正在通過一種方法,最終將使用來自大型多索引熊貓數據框的數據切片。我可以生成口罩用於每個索引(基本上列出值來定義片):Python熊貓,如何通過變量將冒號「:」傳遞給索引器

df.loc[idx[a_mask,b_mask],idx[c_mask,d_mask]] 

這將是罰款,但在某些情況下我真的想選擇一些沿這些軸的一切,東西相當於:

df.loc[idx[a_mask,b_mask],idx[:,d_mask]] 

有我的方式通過,冒號「:」,它取代了c_mask在第二個例子中的變量?理想情況下,我只需將c_mask設置爲像「:」這樣的值,但這當然不起作用(並且不應該因爲如果我們有一列名稱......)。但是有沒有辦法通過變量來傳遞一個值,這個變量是沿着這些索引器之一傳遞「整個軸」的?

我意識到我可以生成一個掩碼,通過沿適當的軸收集所有的值來選擇所有的東西,但這是非常平凡的,並增加了大量的代碼。同樣,我可以將數據幀訪問分爲5個場景(每個場景中有一個:有一個:有一個:有一個有四個面具),但這似乎不符合DRY原則,並且仍然很脆弱,因爲它無法處理整個切片的多個方向選擇。

因此,任何我可以通過一個變量,將選擇一個索引器中的整個方向,如:將?還是有更好的方法來選擇整個方向?

回答

5

idx[slice(None)]相當於idx[:]

所以這些都是等效的。

In [11]: df = DataFrame({'A' : np.random.randn(9)},index=pd.MultiIndex.from_product([range(3),list('abc')],names=['first','second'])) 

In [12]: df 
Out[12]: 
        A 
first second   
0  a  -0.668344 
     b  -1.679159 
     c  0.061876 
1  a  -0.237272 
     b  0.136495 
     c  -1.296027 
2  a  0.554533 
     b  0.433941 
     c  -0.014107 

In [13]: idx = pd.IndexSlice 

In [14]: df.loc[idx[:,'b'],] 
Out[14]: 
        A 
first second   
0  b  -1.679159 
1  b  0.136495 
2  b  0.433941 

In [15]: df.loc[idx[slice(None),'b'],] 
Out[15]: 
        A 
first second   
0  b  -1.679159 
1  b  0.136495 
2  b  0.433941 

In [16]: df.loc[(slice(None),'b'),] 
Out[16]: 
        A 
first second   
0  b  -1.679159 
1  b  0.136495 
2  b  0.433941 
+0

完美!我可以通過它。現在我也看到它在文檔中,也:) –

相關問題