Python 具有多索引的Dataframe筛选器:返回顶级索引级别的所有行给定值筛选器

Python 具有多索引的Dataframe筛选器:返回顶级索引级别的所有行给定值筛选器,python,pandas,multi-index,Python,Pandas,Multi Index,我正在寻找返回所有给定多个最终值条件的第一层数据的语法。我一直在阅读和寻找使用.loc或.xs的过滤解决方案,但我完全可以得到我想要的语法。 我过去使用xpath,本质上我只想要A[B[@x=1和@y=2] 我已经尝试了很多我熟悉的语法排列,使用df.loc df.xs mutlti[]的形式,还有一点使用df.index.get_level_values()等 因此,从这样的数据帧: xy A B a b12 f 4 5 a c 3 4 b d 15 b c 1 2 c d23 我想搜索x和

我正在寻找返回所有给定多个最终值条件的第一层数据的语法。我一直在阅读和寻找使用.loc或.xs的过滤解决方案,但我完全可以得到我想要的语法。 我过去使用xpath,本质上我只想要A[B[@x=1和@y=2]

我已经尝试了很多我熟悉的语法排列,使用df.loc df.xs mutlti[]的形式,还有一点使用df.index.get_level_values()等

因此,从这样的数据帧:

xy
A B
a b12
f 4 5
a c 3 4
b d 15
b c 1 2 c d23

我想搜索x和y的特定组合,并返回索引级别的所有行

所以我想要x=1,y=2,得到

xy
A B
a b12
a f45
a c34
b d15
b c12

因为给定a中至少有一行匹配

更好的更普遍的解决方案是搜索特定B的x值和特定不同B的y值

(试图更清楚):我的意思是,我可能只对组合特定的B值感兴趣,而不是我正在寻找的最终级别值。 下面是B1=b和x=3。所以我混合了匹配一个值和匹配一个索引值。而之前我限制了两个最终值。同样,我在xpath中设想了这一点,比如
//A[B[local-name()==B和@x=3]和B[local-name()==f和@y=5]
(我想我是对的)

例如,B1=b:x=3,B2=f:y=5。返回:

xy
A B
ab12
af45
a c 3 4

谢谢

您可以通过以下几个步骤创建数据帧:

A_idx = df.query('x == 1 & y == 2').index.get_level_values('A')
res = df.query('A in @A_idx')

print(res)

#      x  y
# A B      
# a b  1  2
#   f  4  5
#   c  3  4
# b d  1  5
#   c  1  2
设置

df = pd.DataFrame([['a', 'b', 1, 2], ['a', 'f', 4, 5], ['a', 'c', 3, 4],
                   ['b', 'd', 1, 5], ['b', 'c', 1, 2], ['c', 'd', 2, 3]],
                  columns=['A', 'B', 'x', 'y'])

df = df.set_index(['A', 'B'])

如果要查找的值包含在
x
y
列中,则可以在级别='A'上使用
groupby
,并在为每个
x
y
列创建
标志后使用

现在,如果您希望
x
y
都满足
B
和相同
A
的任何值的条件,您可以在每个标志上使用
any
,并使用
查找这两个:

print (df.groupby(level='A').filter(lambda dfg: dfg.flagx.any() & dfg.flagy.any() )
         .drop(['flagx','flagy'],axis=1))
     x  y
A B      
a b  1  2
  f  4  5
  c  3  4
b d  1  5
  c  1  2
如果希望在同一行上同时满足
x
y
上的两个条件,则可以通过更改
过滤器中
任意
的位置来实现:

print (df.groupby(level='A').filter(lambda dfg: (dfg.flagx & dfg.flagy).any() )
         .drop(['flagx','flagy'],axis=1))
     x  y
A B      
b d  1  5
  c  1  2

使用
groupby
+
transform
+
any

df[df.eq({'x':1,'y':2}).groupby(level=0).transform('any').any(1)]
     x  y
A B      
a b  1  2
  f  4  5
  c  3  4
b d  1  5
  c  1  2

你能更清楚地说明问题的第二部分吗?是否必须满足所有条件,以及以何种组合?或者你还在按
A
进行过滤吗?新年快乐:-)这对该示例数据集非常有效。是否可以调整以容纳带有空格的索引。。。例如,“A 2”而不是“A”?快速阅读空间和查询似乎不太合拍。谢谢(新年快乐!)@DontJudgeMyADD,您可以随时使用
loc
,例如将
df.query('x==1&y==2')
替换为
df.loc[df['x'].eq(1)和df['y'].eq(2))
。新年快乐!@W-B,新年快乐!祝你新年快乐:-)@W-B你也是,关于stackoverflow的很多答案:-)谢谢,我成功了。它还允许我非常轻松地处理带有空格的索引。谢谢!新年快乐!很好的方法
eq
,在a
dict
:-)嗨!返回这是一张空白的桌子,我错过了dict设置,对吗?Thanks@DontJudgeMyADD{'x':1,'y':2}这是我使用的dict。在我身边工作得很好谢谢@W-B,我不知道为什么它对我不起作用。我直接复制粘贴了它,无法获取.eq()我已经搜索了很长一段时间,也找不到一个关于使用.eq的好教程。
df[df.eq({'x':1,'y':2}).groupby(level=0).transform('any').any(1)]
     x  y
A B      
a b  1  2
  f  4  5
  c  3  4
b d  1  5
  c  1  2