Python 2.7 如何使用字符串索引从多索引数据帧中删除行
我有一个带有多索引的数据框,我想根据一些基于索引的模式从中删除行。例如,我想删除第1-4帧,其中注释器是“Peter Test xx”,而下面的数据帧中的标签是“empty”Python 2.7 如何使用字符串索引从多索引数据帧中删除行,python-2.7,pandas,Python 2.7,Pandas,我有一个带有多索引的数据框,我想根据一些基于索引的模式从中删除行。例如,我想删除第1-4帧,其中注释器是“Peter Test xx”,而下面的数据帧中的标签是“empty” print df boundingbox x1 boundingbox y1 \ frame annotator label 0
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),:]
如果我想删除这些行,理想情况下我想做如下操作
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'
有什么建议吗?为了解决另一个问题,我发现可以在
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)
这就是应该怎么做的吗?在进行更复杂的切片时,必须使用loc、iloc或ix:
df[msk] # works
df.iloc[msk, ] # works
df.iloc[msk, :] # works
但是
请参阅。ohhk。我必须使用
iloc
…与loc
有什么区别?但是,如果我使用df.iloc[mask,:]
进行索引,那么我会得到一个完全混合的“帧”索引(在0和1之间交换)+数据似乎也很奇怪。@P.R.hmmm不清楚您看到了什么,在我的示例中,效果很好。您使用的熊猫是什么版本的?请查看我链接到的文档,了解loc和iloc之间的差异。