2017-07-26 94 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