2017-07-26 103 views
0

我Multiiindex DF如下:大熊貓多指標數據框中刪除行

tuples = list(zip(*[['a', 'a', 'b', 'b'], ['c', 'd', 'c', 'd']])) 
index = pd.MultiIndex.from_tuples(tuples, names=['i1', 'i2']) 
df = pd.DataFrame([5, 6, 7, 8], index=index[:4], columns=['col']) 

     col 
i1 i2  
a c  5 
    d  6 
b c  7 
    d  8 

想繼續行其索引(0級)是

idx_to_keep = ['a'] 

應該是一個簡單的任務,但我想不出比

idx_to_drop = np.setdiff1d(pd.unique(df.index.levels[0]), idx_to_keep) 
df.drop(idx_to_drop, inplace = True) 

     col 
i1 i2  
a c  5 
    d  6 

我可以做的更好的其他方式?

+0

的[選擇從一個數據幀的多鍵的橫截面]可能的複製(https://stackoverflow.com/questions/15463729/select-a-multiple-key-cro SS-部分從 - 一個非數據幀) – FLab

回答

2

一種方法是使用index方法get_level_values()

df 
     col 
i1 i2  
a c  5 
    d  6 
b c  7 
    d  8 

df[df.index.get_level_values(0).isin(idx_to_keep)] 
     col 
i1 i2  
a c  5 
    d  6 
+1

發現一個清潔的解決方案,採用 '級' 參數: DF = DF [df.index.isin(idx_to_keep,級別= 0)] –

2

您正在尋找.xs

df.xs('a', axis=0, level=0, drop_level=False) 

其中給出:

 col 
i1 i2  
a c  5 
    d  6 
+2

此外,如果希望保留指數0級,可以指定'drop_level = FALSE' –

+0

什麼,如果我想繼續不僅僅是「A」以上(保留兩個「A」和「B」例如)。 –

2

你可以使用loc

df.loc[['a']] 

所得輸出:

 col 
i1 i2  
a c  5 
    d  6 
0

讓我們用slice

idx_to_keep = ['a'] 
df.loc[slice(*idx_to_keep,)] 

輸出:

 col 
i1 i2  
a c  5 
    d  6