过滤多索引

Filtering a mutli-index

C1 C2 C3 C4
A 12 True 89
9 False 77
5 True 23
B 9 True 45
5 True 45
2 False 78
C 11 True 10
8 False 08
12 False 09

C1 & C2 是多重索引。我希望得到一个结果,它只给我 C1 中的值,这些值在 C2 中既小于 10 又大于或等于 10。

所以在上面的 table 中 C1 - B 应该去,最终结果应该是这样的:

C1 C2 C3 C4
A 12 True 89
9 False 77
5 True 23
C 11 True 10
8 False 08
12 False 09

我尝试了 df.loc[(df.C2 < 10 ) & (df.C2 >= 10)] 但这没有用。

我也试过:

过滤器 1 = df.index.get_level_values('C2') < 10 过滤器 2 = df.index.get_level_values('C2') >= 10

df.iloc[过滤器 1 & 过滤器 2]

我在另一个 post 上看到的建议也没有用。任何人都知道如何解决这个问题?谢谢

使用 GroupBy.transform with GroupBy.any 测试每组至少一个条件匹配,因此最后一个过滤器可能由 m DataFrame:

filter1 = df.index.get_level_values('C2') < 10 
filter2 = df.index.get_level_values('C2') >= 10

m = (df.assign(filter1= filter1, filter2=filter2)
       .groupby(level=0)[['filter1','filter2']]
       .transform('any'))

print (m)
       filter1  filter2
C1 C2                  
A  12     True     True
   9      True     True
   5      True     True
B  9      True    False
   5      True    False
   2      True    False
C  11     True     True
   8      True     True
   12     True     True

df = df[m.filter1 & m.filter2]
print (df)
          C3  C4
C1 C2           
A  12   True  89
   9   False  77
   5    True  23
C  11   True  10
   8   False   8
   12  False   9

备选方案:

filter1 = df.index.get_level_values('C2') < 10 
filter2 = df.index.get_level_values('C2') >= 10

lvl1 = df.index[filter1].remove_unused_levels().levels[0]
lvl2 = df.index[filter2].remove_unused_levels().levels[0]

df1 = df.loc[set(lvl1).intersection(lvl2)]
print (df1)
          C3  C4
C1 C2           
A  12   True  89
   9   False  77
   5    True  23
C  11   True  10
   8   False   8
   12  False   9