【问题标题】:Drop multi-indexed rows of a DataFrame based on 'AND' condition between levels根据级别之间的“AND”条件删除 DataFrame 的多索引行
【发布时间】:2016-05-09 11:20:25
【问题描述】:

我希望能够使用多级标准(使用逻辑 AND 连接标准)从多索引数据框对象中删除行。

考虑以下给出的 pandas 数据框对象:

import pandas as pd
df = pd.DataFrame(data = [[1,'x'],[2,'x'],[1,'y'],[2,'y']],
                   index=pd.MultiIndex(levels=[['A','B'],['a','b']],
                                       labels=[[0,1,0,1],[0,1,1,0]],
                                       names=['idx0','idx1']))

print(df) 输出:

           0  1
idx0 idx1      
A    a     1  x
B    b     2  x
A    b     1  y
B    a     2  y

我希望消除'idx0'=='A' 'idx1'=='a'所在的行,所以最终结果是:

           0  1
idx0 idx1      
B    b     2  x
     a     2  y
A    b     1  y

在我看来,这似乎无法使用 df.drop() 方法完成。给出正确结果的“迂回”方式是:

df = pd.concat([df.drop(labels='A',level=0),df.drop(labels='a',level=1)])
df = df.drop_duplicates()

但我认为必须有更好的方法......

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    要解决您关于 .drop() 的问题 - 只需将 MultiIndex 标签传递为 tuple

    df.drop(('A', 'a'))
    
               0  1
    idx0 idx1      
    B    b     2  x
    A    b     1  y
    B    a     2  y
    

    【讨论】:

      【解决方案2】:

      您可以使用isin 方法作为索引,并与您使用~ 选择的相反:

      In [85]: df.index.isin([('A','a')])
      Out[85]: array([ True, False, False, False], dtype=bool)
      
      In [86]: df[~df.index.isin([('A','a')])]
      Out[86]:
                 0  1
      idx0 idx1
      B    b     2  x
      A    b     1  y
      B    a     2  y
      

      时间:

      In [95]: %timeit df.drop(('A','a'))
      1000 loops, best of 3: 1.33 ms per loop
      
      In [96]: %timeit df[~df.index.isin([('A','a')])]
      1000 loops, best of 3: 457 us per loop
      

      所以下降速度几乎是isin 解决方案的 3 倍。

      【讨论】:

        猜你喜欢
        • 2021-11-23
        • 2016-01-18
        • 2018-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 2023-02-14
        • 1970-01-01
        相关资源
        最近更新 更多