【问题标题】:How to remove rows from multiindex dataframe with string indices如何使用字符串索引从多索引数据框中删除行
【发布时间】:2015-04-22 14:23:13
【问题描述】:

我有一个带有多索引的数据框,我想根据一些基于索引的模式从中删除行。例如,我想在下面的数据框中删除注释器为“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'

有什么建议吗?

【问题讨论】:

    标签: python-2.7 pandas


    【解决方案1】:

    试图解决另一个问题,我发现可以使用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)
    

    这是应该的吗?

    【讨论】:

      【解决方案2】:

      在进行更复杂的切片时,您必须使用 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

      【讨论】:

      • 哦。我将不得不使用iloc...与loc 有什么区别?但是,如果我使用df.iloc[mask,:] 进行索引,那么我会得到一个完全混合的“帧”索引(在 0 和 1 之间交换)+ 数据似乎也很奇怪。
      • @P.R.嗯不清楚你看到了什么,在我的例子中它工作正常。你用的是什么版本的熊猫?查看我链接到的文档,了解 loc 和 iloc 之间的区别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 2021-03-22
      • 2022-10-05
      相关资源
      最近更新 更多