如何使用字符串索引从多索引数据框中删除行

时间:2015-02-20 19:38:18

标签: python-2.7 pandas

我有一个带有multiindex的数据框,我想根据一些基于索引的模式从中删除行。例如,我想删除注释器为“Peter Test xx”的帧1-4,并且下面的数据框中的标签为“空”

print df
                                        boundingbox x1  boundingbox y1  \
frame  annotator              label                                          
0      Peter Test xx          empty                    NaN             NaN   
1      Peter Test xx          empty                    NaN             NaN   
2      Peter Test xx          empty                    NaN             NaN   
3      Peter Test xx          empty                    NaN             NaN   
       Petaa                  yea                      NaN             NaN   
4      Peter Test xx          empty                    NaN             NaN   
5      P                      empty frame              494              64   
       Peter Test xx          empty                    NaN             NaN   
6      P                      empty frame              494              64   
       Peter Test xx          empty                    NaN             NaN   
7      P                      empty frame              494              64   
       Peter Test xx          empty                    NaN             NaN   
8      P                      empty frame              494              64   
       Peter Test xx          empty                    NaN             NaN   

我可以通过执行类似

的操作来选择行
indexer = [slice(None)]*len(df.index.names)
indexer[df.index.names.index('frame')] = range(1,4)
indexer[df.index.names.index('annotator')] = ['Peter Test xx']
indexer[df.index.names.index('label')] = ['empty']
return df.loc[tuple(indexer),:]

如果我想删除这些行,理想情况下我想做类似

的操作
del df.loc[tuple(indexer),:]

但这不起作用(为什么?)。我在网上找到的所有解决方案都是基于int的索引。但是,如果我使用字符串作为索引,我不能简单地切片或者这样的东西。

我尝试过的东西是:

def filterFunc(x, frames, annotator, label):
    if x[0] in frames\
    and x[1] == annotator\
    and x[2] == label:
        return 1
    else:
        return 0

mask = df.index.map(lambda x: filterFunc(x, frames, annotator, label))

return df[~mask,:]

这给了我:

TypeError: unhashable type: 'numpy.ndarray'

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

尝试解决另一个问题我发现可以使用drop中数据框的选定部分的索引:

indexer = [slice(None)]*len(df.index.names)
indexer[df.index.names.index('frame')] = range(1,4)
indexer[df.index.names.index('annotator')] = ['Peter Test xx']
indexer[df.index.names.index('label')] = ['empty']
selection = df.loc[tuple(indexer),:]
df.drop(selection.index)

应该怎么做?

答案 1 :(得分:0)

在进行更复杂的切片时,你必须使用loc,iloc或ix:

df[msk]  # works

df.iloc[msk, ]  # works
df.iloc[msk, :]  # works

df[msk, ]
TypeError: unhashable type: 'numpy.ndarray'

请参阅different choices for indexing in the docs