Pandas 从前两个级别具有重复索引的多级数据帧中删除行列表

Pandas 从前两个级别具有重复索引的多级数据帧中删除行列表,pandas,Pandas,我想从多层数据框中删除行索引列表,其中前两层有重复的条目。我想这是可能的,没有一个循环,但到目前为止,我还没有发现这一点 我试图通过提供一个列表行索引组合来使用pd.drop函数,尽管这并没有达到预期的效果。例如: import numpy as np import pandas as pd def mklbl(prefix, n): return ["%s%s" % (prefix, i) for i in range(n)] def src_rec(n, mult):

我想从多层数据框中删除行索引列表,其中前两层有重复的条目。我想这是可能的,没有一个循环,但到目前为止,我还没有发现这一点

我试图通过提供一个列表行索引组合来使用pd.drop函数,尽管这并没有达到预期的效果。例如:

import numpy as np
import pandas as pd
def mklbl(prefix, n):
     return ["%s%s" % (prefix, i) for i in range(n)]


def src_rec(n, mult):
    src = [[no]*mult for no in range(1,n)]

    src = [item for sublist in src for item in sublist]

    rec = [no for no in range(1,n)]*mult

    return src, rec

src, rec = src_rec(4,4)


miindex = pd.MultiIndex.from_arrays([src*2,
                                   rec*2,
                                   mklbl('C', 24)])

dfmi = pd.DataFrame(np.arange(len(miindex) * 2)\
               .reshape((len(miindex), 2)),
                index=miindex)
我想删除索引值为(1,2,:)和(2,3,:)的所有行 其结果是:

          0   1
1 1 C0    0   1
2 1 C18  36  37
  2 C19  38  39
3 3 C20  40  41
  1 C21  42  43
  2 C22  44  45
  3 C23  46  47
而我期望的结果是:

          0   1
1 1 C0    0   1
  3 C2    4   5
  1 C3    6   7
2 2 C4    8   9
  1 C6   12  13
  2 C7   14  15
3 3 C8   16  17
  1 C9   18  19
  2 C10  20  21
  3 C11  22  23
1 1 C12  24  25
  3 C14  28  29
  1 C15  30  31
2 2 C16  32  33
  1 C18  36  37
  2 C19  38  39
3 3 C20  40  41
  1 C21  42  43
  2 C22  44  45
  3 C23  46  47
循环中的一个例子是

for A, B in zip(As, Bs):
    dfmi_drop_idx = CCdata.loc[(A, B, slice(None)), :].index
    dfmi.drop(dfmi_drop_idx, inplace=True, errors='raise')
通过以下方式与测试成员一起使用:


感谢@jezrael,将其应用于30万行时肯定会更快;-)
for A, B in zip(As, Bs):
    dfmi_drop_idx = CCdata.loc[(A, B, slice(None)), :].index
    dfmi.drop(dfmi_drop_idx, inplace=True, errors='raise')
m = pd.MultiIndex.from_arrays([As,Bs])
df = dfmi[~dfmi.reset_index(level=2, drop=True).index.isin(m)]
print (df)
          0   1
1 1 C0    0   1
  3 C2    4   5
  1 C3    6   7
2 2 C4    8   9
  1 C6   12  13
  2 C7   14  15
3 3 C8   16  17
  1 C9   18  19
  2 C10  20  21
  3 C11  22  23
1 1 C12  24  25
  3 C14  28  29
  1 C15  30  31
2 2 C16  32  33
  1 C18  36  37
  2 C19  38  39
3 3 C20  40  41
  1 C21  42  43
  2 C22  44  45
  3 C23  46  47